This commit is contained in:
Georges KABBOUCHI 2021-07-25 02:40:30 +03:00
parent 639dd118a3
commit 5d00313260
72 changed files with 2228 additions and 12 deletions

View File

@ -0,0 +1 @@
<svg width="18" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 7a1 1 0 00-1-1H3.93l3.863-3.863a.999.999 0 000-1.414L7.707.637a.999.999 0 00-1.414 0L.637 6.293a.999.999 0 000 1.414l5.656 5.656a.999.999 0 001.414 0l.086-.086a.999.999 0 000-1.414L3.93 8H17a1 1 0 001-1z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 320 B

View File

@ -0,0 +1 @@
<svg viewBox="0 0 18 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11 .342a1 1 0 00-.707.295l-.086.086a.999.999 0 000 1.414L14.07 6H1a1 1 0 000 2h13.07l-3.863 3.863a.999.999 0 000 1.414l.086.086a.999.999 0 001.414 0l5.656-5.656a.999.999 0 000-1.414L11.707.637A.998.998 0 0011 .342z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 326 B

1
assets/icons/close.svg Normal file
View File

@ -0,0 +1 @@
<svg viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.99.99a1 1 0 00-.697 1.717L7.586 9l-6.293 6.293a1 1 0 101.414 1.414L9 10.414l6.293 6.293a1 1 0 101.414-1.414L10.414 9l6.293-6.293a1 1 0 10-1.414-1.414L9 7.586 2.707 1.293A1 1 0 001.99.99z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 299 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path d="M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z"/><path d="M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z"/></svg>

After

Width:  |  Height:  |  Size: 292 B

5
assets/icons/info.svg Normal file
View File

@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0C3.5888 0 0 3.58885 0 8.00005C0 12.4112 3.5888 16 8 16C12.4112 16 16 12.4112 16 8.00005C16 3.58885 12.4112 0 8 0ZM8 14.5455C4.39079 14.5455 1.45455 11.6092 1.45455 8.00005C1.45455 4.39088 4.39079 1.45455 8 1.45455C11.6092 1.45455 14.5455 4.39088 14.5455 8.00005C14.5455 11.6092 11.6092 14.5455 8 14.5455Z" fill="currentColor"/>
<path d="M7.9999 3.39394C7.46531 3.39394 7.0304 3.82914 7.0304 4.36407C7.0304 4.89852 7.46531 5.33333 7.9999 5.33333C8.5345 5.33333 8.96941 4.89852 8.96941 4.36407C8.96941 3.82914 8.5345 3.39394 7.9999 3.39394Z" fill="currentColor"/>
<path d="M8 6.78788C7.59835 6.78788 7.27273 7.1135 7.27273 7.51515V11.8788C7.27273 12.2804 7.59835 12.6061 8 12.6061C8.40165 12.6061 8.72727 12.2804 8.72727 11.8788V7.51515C8.72727 7.1135 8.40165 6.78788 8 6.78788Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 916 B

1
assets/icons/pending.svg Normal file
View File

@ -0,0 +1 @@
<svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path opacity=".1" fill-rule="evenodd" clip-rule="evenodd" d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24z" fill="currentColor"/><path d="M17 15a2 2 0 00-2 2v14a2 2 0 002 2h5.588a8.015 8.015 0 01-.375-4.848c.67-2.924 3.017-5.27 5.941-5.941a8.015 8.015 0 014.848.375V17a2 2 0 00-2-2h-4.146c-.419 0-.825.239-.958.635a2 2 0 01-3.795 0c-.133-.396-.54-.635-.959-.635H17zm13 9c-3.309 0-6 2.691-6 6s2.691 6 6 6 6-2.691 6-6-2.691-6-6-6zm0 2c2.206 0 4 1.794 4 4s-1.794 4-4 4-4-1.794-4-4 1.794-4 4-4zm.818 1.379a.751.751 0 00-.73.392l-1 1.875a.75.75 0 00.133.883l1.25 1.25a.743.743 0 001.058.002.75.75 0 000-1.06l-.855-.858.738-1.384a.751.751 0 00-.594-1.1z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 780 B

3
assets/icons/price.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.7052 15.7052L16.0588 16.0588L15.7052 15.7052C6.54562 24.865 1.5 37.0461 1.5 50C1.5 62.9539 6.54562 75.135 15.7052 84.2948C24.865 93.4546 37.0461 98.5 50 98.5C62.9539 98.5 75.135 93.4546 84.2948 84.2948C93.4544 75.135 98.5 62.9539 98.5 50C98.5 37.0461 93.4544 24.865 84.2948 15.7052L83.9554 16.0446L84.2948 15.7052C75.135 6.54543 62.9539 1.5 50 1.5C37.0461 1.5 24.865 6.54543 15.7052 15.7052ZM50 91.875C26.9105 91.875 8.125 73.0895 8.125 50C8.125 26.9105 26.9105 8.125 50 8.125C73.0895 8.125 91.875 26.9105 91.875 50C91.875 73.0895 73.0895 91.875 50 91.875ZM46.9874 46.6874C43.831 46.6874 41.2624 44.1188 41.2624 40.9626C41.2624 37.8062 43.8312 35.2376 46.9874 35.2376H59.0375C60.8669 35.2376 62.35 33.7545 62.35 31.9251C62.35 30.0957 60.8669 28.6126 59.0375 28.6126H53.3125V22.8876C53.3125 21.0582 51.8294 19.5751 50 19.5751C48.1706 19.5751 46.6875 21.0582 46.6875 22.8876V28.6162C40.0152 28.7761 34.6376 34.2528 34.6376 40.9626C34.6376 47.7728 40.1774 53.3124 46.9876 53.3124H53.0127C56.1689 53.3124 58.7375 55.8812 58.7375 59.0374C58.7375 62.1937 56.1689 64.7624 53.0127 64.7624H40.9626C39.1332 64.7624 37.6501 66.2455 37.6501 68.0749C37.6501 69.9043 39.1332 71.3874 40.9626 71.3874H46.6875V77.1126C46.6875 78.942 48.1706 80.4251 50 80.4251C51.8294 80.4251 53.3125 78.942 53.3125 77.1126V71.3839C59.9846 71.2241 65.3624 65.7473 65.3624 59.0374C65.3624 52.2273 59.8227 46.6874 53.0125 46.6874H46.9874Z" fill="currentColor" stroke="currentColor" stroke-width="2.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
assets/icons/spinner.svg Normal file
View File

@ -0,0 +1 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 22c5.523 0 10-4.477 10-10h-3a7 7 0 01-7 7v3zM2 12C2 6.477 6.477 2 12 2v3a7 7 0 00-7 7H2z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 202 B

15
assets/logo/aave-v2.svg Normal file
View File

@ -0,0 +1,15 @@
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M31.2243 12.8547C31.0864 5.61495 25.1062 -0.135471 17.8639 0.00242924C10.8146 0.133434 5.13795 5.8149 5.0069 12.8547C5.0069 12.8892 5 12.9236 5 12.9512V13.1512V36.8492C5 37.656 5.65526 38.3041 6.45537 38.3041C7.25549 38.3041 7.91075 37.6491 7.91075 36.8492V32.6157C7.91075 31.809 8.56601 31.1609 9.36612 31.1609C10.1662 31.1609 10.8215 31.8159 10.8215 32.6157V34.6222C10.8422 35.4289 11.5044 36.0632 12.3114 36.0494C13.0908 36.0356 13.7185 35.4013 13.7391 34.6222V32.6157C13.7391 31.809 14.3944 31.1609 15.1945 31.1609C16.0015 31.1609 16.6499 31.8159 16.6499 32.6157V33.1673C16.6499 33.974 17.3052 34.6222 18.1053 34.6222C18.9123 34.6222 19.5606 33.9671 19.5606 33.1673V32.6157C19.5813 31.809 20.2435 31.1747 21.0505 31.1885C21.8299 31.2022 22.4576 31.8366 22.4783 32.6157V34.6222C22.4783 35.4289 23.1336 36.077 23.9337 36.077C24.7338 36.077 25.4028 35.4358 25.4028 34.6291V32.6226C25.4028 31.8159 26.0581 31.1678 26.8582 31.1678C27.6652 31.1678 28.3136 31.8228 28.3136 32.6226V36.8561C28.3136 37.6628 28.9688 38.311 29.769 38.311C30.5691 38.311 31.2243 37.656 31.2243 36.8561V12.9581C31.2312 12.9236 31.2312 12.8892 31.2243 12.8547ZM13.277 14.9577C11.9872 14.9577 10.9457 13.7648 10.9457 12.2824C10.9457 10.8 11.9941 9.60715 13.277 9.60715C14.5599 9.60715 15.6084 10.8 15.6084 12.2824C15.6084 13.7648 14.5668 14.9577 13.277 14.9577ZM18.2156 18.7361C17.0431 18.7361 16.0981 18.0397 16.0981 17.1778C16.0981 16.316 17.05 16.84 18.2156 16.84C19.3813 16.84 20.3332 16.3229 20.3332 17.1778C20.3332 18.0328 19.3882 18.7292 18.2156 18.7361ZM22.9542 14.9577C21.6644 14.9577 20.6229 13.7648 20.6229 12.2824C20.6229 10.8 21.6644 9.60715 22.9542 9.60715C24.2441 9.60715 25.2856 10.8 25.2856 12.2824C25.2856 13.7648 24.2372 14.9577 22.9542 14.9577Z" fill="url(#paint0_linear)"/>
<circle cx="26.3114" cy="31.1476" r="8.85246" fill="white" fill-opacity="0.9"/>
<path d="M23.0049 34.0984L25.2163 27.8033C25.3158 27.5862 25.4605 27.4777 25.6504 27.4777C25.759 27.4777 25.8494 27.5048 25.9218 27.5591C26.0303 27.6495 26.0846 27.7581 26.0846 27.8847V27.939C26.0846 27.957 26.0755 27.9842 26.0575 28.0204L23.7375 34.3426C23.629 34.7044 23.3712 34.8853 22.9642 34.8853C22.6024 34.8853 22.3582 34.7044 22.2316 34.3426L19.8709 28.0475C19.8528 27.9932 19.8438 27.9435 19.8438 27.8983C19.8438 27.853 19.8573 27.8033 19.8845 27.749C19.9116 27.6948 19.9478 27.645 19.993 27.5998C20.0925 27.5184 20.1965 27.4777 20.3051 27.4777C20.5312 27.4777 20.6759 27.5772 20.7392 27.7762L23.0049 34.0984ZM29.3668 28.1832C29.2221 28.1832 29.0864 28.1967 28.9598 28.2239C28.8422 28.251 28.7246 28.2872 28.607 28.3324C28.399 28.3957 28.2136 28.4726 28.0508 28.563C27.897 28.6535 27.7749 28.6987 27.6845 28.6987C27.594 28.6987 27.5171 28.6671 27.4538 28.6037C27.3905 28.5404 27.3589 28.4681 27.3589 28.3867C27.3589 28.3053 27.3905 28.2284 27.4538 28.156C27.5171 28.0837 27.6031 28.0113 27.7116 27.939C27.8201 27.8666 27.9422 27.7988 28.0779 27.7355C28.2136 27.6721 28.3628 27.6224 28.5256 27.5862C28.8693 27.4777 29.1768 27.4234 29.4482 27.4234C29.7195 27.4234 29.9863 27.4596 30.2486 27.5319C30.52 27.6043 30.7596 27.7219 30.9677 27.8847C31.4018 28.2103 31.6189 28.6354 31.6189 29.16C31.6189 30.0735 30.9179 31.2131 29.516 32.5789C29.2447 32.8412 28.9643 33.1215 28.6749 33.42C28.3945 33.7094 28.1457 33.9446 27.9287 34.1255H31.239C31.3656 34.1255 31.4606 34.1662 31.5239 34.2476C31.5872 34.329 31.6189 34.4195 31.6189 34.5189C31.6189 34.6184 31.5872 34.7044 31.5239 34.7767C31.4606 34.8491 31.3656 34.8853 31.239 34.8853H27.481C27.2639 34.8853 27.1011 34.84 26.9925 34.7496C26.8931 34.6591 26.8433 34.5551 26.8433 34.4375C26.8433 34.1933 26.9428 33.9808 27.1418 33.7999C27.3408 33.619 27.5714 33.3929 27.8337 33.1215C28.096 32.8502 28.3538 32.5879 28.607 32.3347C28.8603 32.0814 29.1135 31.8146 29.3668 31.5342C29.62 31.2538 29.8371 30.978 30.018 30.7066C30.4521 30.1097 30.6692 29.6213 30.6692 29.2414C30.6692 28.9067 30.5335 28.6444 30.2622 28.4545C30.027 28.2736 29.7286 28.1832 29.3668 28.1832Z" fill="url(#paint1_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="4.06121" y1="36.6364" x2="37.7598" y2="20.827" gradientUnits="userSpaceOnUse">
<stop stop-color="#30BAC6"/>
<stop offset="1" stop-color="#B6509E"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="30.5981" y1="28.9237" x2="22.9129" y2="35.8965" gradientUnits="userSpaceOnUse">
<stop stop-color="#B155A0"/>
<stop offset="1" stop-color="#49BFCA"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

9
assets/logo/aave.svg Normal file
View File

@ -0,0 +1,9 @@
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.241 13.4214C34.0977 5.8625 27.8857 -0.141443 20.3626 0.00253633C13.04 0.139317 7.1433 6.07127 7.00716 13.4214C7.00716 13.4574 7 13.4934 7 13.5222V13.731V38.4738C7 39.3161 7.68067 39.9928 8.5118 39.9928C9.34293 39.9928 10.0236 39.3089 10.0236 38.4738V34.0537C10.0236 33.2114 10.7043 32.5347 11.5354 32.5347C12.3665 32.5347 13.0472 33.2186 13.0472 34.0537V36.1486C13.0687 36.9908 13.7565 37.6531 14.5948 37.6387C15.4044 37.6243 16.0565 36.962 16.0779 36.1486V34.0537C16.0779 33.2114 16.7586 32.5347 17.5897 32.5347C18.428 32.5347 19.1015 33.2186 19.1015 34.0537V34.6296C19.1015 35.4718 19.7822 36.1486 20.6133 36.1486C21.4516 36.1486 22.1251 35.4646 22.1251 34.6296V34.0537C22.1466 33.2114 22.8345 32.5491 23.6728 32.5635C24.4824 32.5779 25.1344 33.2402 25.1559 34.0537V36.1486C25.1559 36.9908 25.8366 37.6675 26.6677 37.6675C27.4988 37.6675 28.1938 36.998 28.1938 36.1557V34.0609C28.1938 33.2186 28.8745 32.5419 29.7056 32.5419C30.5439 32.5419 31.2174 33.2258 31.2174 34.0609V38.481C31.2174 39.3233 31.8981 40 32.7292 40C33.5603 40 34.241 39.3161 34.241 38.481V13.5294C34.2482 13.4934 34.2482 13.4574 34.241 13.4214ZM15.5979 15.6171C14.2581 15.6171 13.1762 14.3717 13.1762 12.8239C13.1762 11.2761 14.2652 10.0307 15.5979 10.0307C16.9306 10.0307 18.0196 11.2761 18.0196 12.8239C18.0196 14.3717 16.9377 15.6171 15.5979 15.6171ZM20.728 19.5621C19.5099 19.5621 18.5283 18.835 18.5283 17.9352C18.5283 17.0353 19.5171 17.5824 20.728 17.5824C21.9388 17.5824 22.9276 17.0425 22.9276 17.9352C22.9276 18.8278 21.946 19.5549 20.728 19.5621ZM25.6503 15.6171C24.3104 15.6171 23.2285 14.3717 23.2285 12.8239C23.2285 11.2761 24.3104 10.0307 25.6503 10.0307C26.9901 10.0307 28.072 11.2761 28.072 12.8239C28.072 14.3717 26.9829 15.6171 25.6503 15.6171Z" fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="6.02481" y1="38.2515" x2="41.0941" y2="21.883" gradientUnits="userSpaceOnUse">
<stop stop-color="#30BAC6"/>
<stop offset="1" stop-color="#B6509E"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

10
assets/logo/aave_old.svg Normal file
View File

@ -0,0 +1,10 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.55401 13.004V13.364L8.55376 13.3688C8.55143 13.4147 8.54112 13.6184 8.37201 13.774C8.20962 13.9126 8.0237 13.9022 7.98512 13.9001L7.98401 13.9C7.91601 13.892 7.69801 13.854 7.57201 13.678C7.47001 13.534 7.46201 13.346 7.46001 13.286C7.45832 13.2422 7.46055 13.2133 7.46248 13.1881C7.46514 13.1534 7.46727 13.1258 7.45801 13.076C7.43001 12.922 7.33601 12.82 7.30401 12.786C7.28801 12.768 7.13401 12.616 6.91401 12.61C6.67201 12.602 6.43601 12.774 6.33201 13.038V13.976C6.29801 14.252 6.06401 14.462 5.79001 14.468C5.52601 14.474 5.29001 14.288 5.23201 14.026V13.032C5.17801 12.77 4.95001 12.578 4.68801 12.572C4.41401 12.564 4.17001 12.762 4.11601 13.036V14.866C4.05801 15.128 3.82401 15.312 3.56401 15.308C3.32201 15.304 3.10601 15.138 3.03601 14.898V5.252C3.07201 4.848 3.24801 3.368 4.48401 2.15199C5.95601 0.70199 7.81001 0.73399 8.13401 0.74599C9.96001 0.80799 11.132 1.85999 11.438 2.15199C12.742 3.402 12.94 4.93 12.98 5.33C12.978 6.92 12.9755 8.51001 12.973 10.1V10.1V10.1C12.9705 11.69 12.968 13.28 12.966 14.87C12.902 15.12 12.69 15.296 12.456 15.306C12.174 15.318 11.908 15.09 11.878 14.774V13.02C11.82 12.75 11.576 12.56 11.308 12.57C11.024 12.58 10.786 12.814 10.772 13.108V13.922C10.764 14.198 10.554 14.426 10.288 14.462C10.008 14.498 9.73801 14.312 9.67001 14.03V13.112C9.65201 12.842 9.45201 12.622 9.19801 12.58C8.91801 12.534 8.63401 12.714 8.55401 13.004ZM7.08196 5.38998C7.08196 5.97651 6.60649 6.45199 6.01995 6.45199C5.43342 6.45199 4.95795 5.97651 4.95795 5.38998C4.95795 4.80345 5.43342 4.32797 6.01995 4.32797C6.60649 4.32797 7.08196 4.80345 7.08196 5.38998ZM9.69402 6.45199C10.2805 6.45199 10.756 5.97651 10.756 5.38998C10.756 4.80345 10.2805 4.32797 9.69402 4.32797C9.10749 4.32797 8.63202 4.80345 8.63202 5.38998C8.63202 5.97651 9.10749 6.45199 9.69402 6.45199ZM8.84197 7.31399C8.84197 7.31399 8.73597 7.78 8.22597 7.84C7.33795 7.946 7.23395 7.31399 7.23395 7.31399C7.23395 7.31399 7.18195 6.96999 7.56996 7.08399C7.95796 7.19799 8.51597 7.08399 8.51597 7.08399C8.51597 7.08399 8.92198 6.98599 8.84197 7.31399Z" fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="2.49721" y1="14.2119" x2="12.8691" y2="4.82402" gradientUnits="userSpaceOnUse">
<stop offset="0.229" stop-color="#8ADAE2"/>
<stop offset="0.72" stop-color="#9EADCE"/>
<stop offset="1" stop-color="#C499C9"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,10 @@
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 40C31.0457 40 40 31.0457 40 20C40 8.9543 31.0457 0 20 0C8.9543 0 0 8.9543 0 20C0 31.0457 8.9543 40 20 40Z" fill="url(#paint0_linear)"/>
<path d="M28 15.8437C27.9159 11.4261 24.2682 7.91734 19.8506 8.00148C15.5509 8.08142 12.0884 11.544 12.0042 15.8437C12.0042 15.8648 12 15.8858 12 15.9026V16.0246V30.489C12.0126 30.9812 12.4165 31.3683 12.9088 31.3599C13.3842 31.3515 13.767 30.9644 13.7796 30.489V27.9016C13.7796 27.4093 14.1793 27.0138 14.6674 27.0138C15.1596 27.0138 15.5551 27.4135 15.5551 27.9016V29.1259C15.5551 29.6181 15.9548 30.0136 16.4428 30.0136C16.9351 30.0136 17.3305 29.6139 17.3305 29.1259V27.9016C17.3305 27.4093 17.7302 27.0138 18.2182 27.0138C18.7105 27.0138 19.106 27.4135 19.106 27.9016V28.2381C19.1186 28.7304 19.5225 29.1175 20.0147 29.109C20.4901 29.1006 20.873 28.7136 20.8856 28.2381V27.9016C20.8856 27.4093 21.2853 27.0138 21.7733 27.0138C22.2614 27.0138 22.6611 27.4135 22.6611 27.9016V29.1259C22.6611 29.6181 23.0607 30.0136 23.5488 30.0136C24.0368 30.0136 24.4365 29.6139 24.4365 29.1259V27.9016C24.4365 27.4093 24.8362 27.0138 25.3242 27.0138C25.8165 27.0138 26.2161 27.4093 26.2161 27.9016V30.489C26.2161 30.9812 26.6158 31.3767 27.1039 31.3767C27.5919 31.3767 27.9916 30.977 27.9916 30.489V15.9068C28 15.8858 28 15.8648 28 15.8437ZM17.0529 17.1227C16.2661 17.1227 15.6308 16.3907 15.6308 15.4903C15.6308 14.59 16.2703 13.8579 17.0529 13.8579C17.8354 13.8579 18.4749 14.59 18.4749 15.4903C18.4749 16.3907 17.8396 17.1227 17.0529 17.1227ZM20.0652 19.4283C19.3542 19.4283 18.7736 19.0033 18.7736 18.4774C18.7736 17.9515 19.3542 18.2713 20.0652 18.2713C20.7762 18.2713 21.3568 17.9557 21.3568 18.4774C21.3568 18.9991 20.7804 19.4283 20.0652 19.4283ZM22.9514 17.1227C22.1646 17.1227 21.5293 16.3907 21.5293 15.4903C21.5293 14.59 22.1646 13.8579 22.9514 13.8579C23.7381 13.8579 24.3776 14.59 24.3776 15.4903C24.3776 16.3907 23.7423 17.1227 22.9514 17.1227Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear" x1="36.28" y1="9.08" x2="6.52" y2="34.12" gradientUnits="userSpaceOnUse">
<stop stop-color="#B6509E"/>
<stop offset="1" stop-color="#2EBAC6"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 163 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<g fill="none" fill-rule="evenodd">
<rect width="32" height="32" fill="#627EEA" />
<g fill="#FFF" fill-rule="nonzero">
<path fill-opacity=".602" d="M16.498 4v8.87l7.497 3.35z" />
<path d="M16.498 4L9 16.22l7.498-3.35z" />
<path fill-opacity=".602" d="M16.498 21.968v6.027L24 17.616z" />
<path d="M16.498 27.995v-6.028L9 17.616z" />
<path fill-opacity=".2" d="M16.498 20.573l7.497-4.353-7.497-3.348z" />
<path fill-opacity=".602" d="M9 16.22l7.498 4.353v-7.701z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 646 B

View File

@ -0,0 +1 @@
<svg viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="80" height="80" rx="40" fill="#E5F5F2" /><path d="M61.63 27.633v23.002s.127 2.505-1.92 2.505c-2.047 0-1.642-2.468-1.642-2.468v-18.93s.18-2.092-.825-1.095c-1.006.998-11.498 7.95-11.498 7.95s-1.095.503-1.095 2.19v10.696s.337 1.92-1.642 1.92c0 0-1.373.022-1.373-1.096V39.694s-.165-1.373 1.373-2.468C44.544 36.13 59.162 26.26 59.162 26.26s2.34-1.02 2.468 1.372zM38.357 52.306v-12.06s0-1.605-1.372-2.467L20.56 26.26s-1.92-.833-2.19 1.095v24.683s-.045 1.342 1.095 1.642c0 0 1.92.638 1.92-1.92V32.02s-.248-1.508 1.095-.548S34.255 39.7 34.255 39.7s.825.33.825 1.372v11.243s-.112 1.657 1.642 1.643c1.748-.015 1.636-1.65 1.636-1.65z" fill="#4FA89A"/></svg>

After

Width:  |  Height:  |  Size: 731 B

View File

@ -0,0 +1,5 @@
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" fill="#8247E5"/>
<path d="M24.1203 12.3894C23.9506 12.2935 23.7596 12.2432 23.5653 12.2432C23.371 12.2432 23.18 12.2935 23.0103 12.3894L20.4639 13.8853L18.7344 14.8613L16.1879 16.3572C16.0183 16.4531 15.8272 16.5035 15.6329 16.5035C15.4387 16.5035 15.2476 16.4531 15.078 16.3572L13.0539 15.1866C12.8892 15.091 12.7517 14.954 12.6545 14.7888C12.5573 14.6237 12.5037 14.4359 12.4989 14.2437V11.9364C12.4967 11.7427 12.5473 11.5521 12.6452 11.3858C12.7432 11.2194 12.8846 11.0836 13.0539 10.9935L15.0453 9.85523C15.215 9.75932 15.406 9.70896 15.6003 9.70896C15.7946 9.70896 15.9856 9.75932 16.1553 9.85523L18.1467 10.9935C18.3115 11.0891 18.4491 11.226 18.5463 11.3912C18.6435 11.5564 18.697 11.7442 18.7017 11.9364V13.4316L20.4312 12.424V10.9281C20.4335 10.7344 20.3829 10.5438 20.285 10.3774C20.187 10.211 20.0456 10.0753 19.8762 9.98521L16.1879 7.83864C16.0183 7.74273 15.8272 7.69238 15.6329 7.69238C15.4387 7.69238 15.2476 7.74273 15.078 7.83864L11.3244 9.98521C11.1551 10.0753 11.0137 10.2111 10.9157 10.3775C10.8178 10.5439 10.7671 10.7344 10.7694 10.9281V15.2536C10.7671 15.4473 10.8178 15.6378 10.9157 15.8042C11.0137 15.9706 11.1551 16.1064 11.3244 16.1965L15.078 18.343C15.2476 18.439 15.4387 18.4893 15.6329 18.4893C15.8272 18.4893 16.0183 18.439 16.1879 18.343L18.7344 16.8817L20.4639 15.8735L23.0103 14.4122C23.18 14.3162 23.371 14.2659 23.5653 14.2659C23.7596 14.2659 23.9506 14.3162 24.1203 14.4122L26.1117 15.5504C26.2763 15.6461 26.4138 15.7831 26.5109 15.9483C26.608 16.1134 26.6614 16.3012 26.666 16.4934V18.8007C26.6683 18.9943 26.6177 19.1848 26.5199 19.3512C26.4221 19.5176 26.2809 19.6534 26.1117 19.7436L24.1203 20.9141C23.9506 21.0101 23.7596 21.0604 23.5653 21.0604C23.371 21.0604 23.18 21.0101 23.0103 20.9141L21.0189 19.7759C20.8542 19.6802 20.7167 19.5432 20.6195 19.378C20.5223 19.2129 20.4687 19.0252 20.4639 18.833V17.3371L18.7344 18.3453V19.8413C18.732 20.035 18.7827 20.2256 18.8806 20.392C18.9785 20.5584 19.12 20.6941 19.2894 20.7842L23.043 22.9307C23.2126 23.0266 23.4037 23.077 23.5979 23.077C23.7922 23.077 23.9833 23.0266 24.1529 22.9307L27.9065 20.7842C28.0713 20.6886 28.2089 20.5516 28.3061 20.3864C28.4033 20.2213 28.4569 20.0335 28.4615 19.8413V15.5081C28.4638 15.3144 28.4131 15.1239 28.3152 14.9575C28.2172 14.7911 28.0758 14.6553 27.9065 14.5652L24.1203 12.3894Z" fill="white"/>
<path d="M7.96584 28.3525V29.8205H6.9231V25.4927H8.6495C8.95254 25.4865 9.25306 25.549 9.52859 25.6753C9.77224 25.7873 9.97788 25.9681 10.1203 26.1953C10.2615 26.4254 10.3342 26.6909 10.3299 26.9608C10.3376 27.1533 10.3007 27.345 10.2221 27.521C10.1435 27.6969 10.0253 27.8523 9.87685 27.9751C9.52052 28.2452 9.07963 28.3794 8.63327 28.3538L7.96584 28.3525ZM7.96584 27.5471H8.6495C8.81732 27.5588 8.98308 27.5044 9.11136 27.3956C9.16662 27.3395 9.2095 27.2724 9.23722 27.1986C9.26494 27.1249 9.2769 27.0462 9.2723 26.9676C9.28114 26.7912 9.22265 26.6182 9.10865 26.4834C9.05196 26.4225 8.9828 26.3746 8.9059 26.3428C8.829 26.3111 8.74616 26.2963 8.66302 26.2994H7.96786L7.96584 27.5471ZM14.5482 27.7459C14.5559 28.1323 14.4756 28.5155 14.3136 28.8664C14.1701 29.1772 13.9378 29.4386 13.6461 29.6177C13.3487 29.7956 13.0074 29.8867 12.6609 29.8807C12.3169 29.8871 11.9778 29.7991 11.6803 29.6265C11.3922 29.4542 11.1603 29.2019 11.0129 28.9002C10.8485 28.5632 10.7627 28.1932 10.762 27.8182V27.5748C10.7541 27.188 10.8339 26.8045 10.9953 26.4529C11.1391 26.1421 11.3718 25.8808 11.6641 25.7023C11.9625 25.5227 12.3052 25.43 12.6534 25.4346C12.9983 25.4288 13.3378 25.5194 13.634 25.6963C13.9252 25.8737 14.1587 26.1319 14.3061 26.4394C14.4705 26.7852 14.5529 27.1643 14.5469 27.5471L14.5482 27.7459ZM13.4872 27.5647C13.5084 27.2245 13.4337 26.8852 13.2715 26.5855C13.2077 26.4796 13.1168 26.3928 13.0081 26.3341C12.8994 26.2753 12.7769 26.2468 12.6534 26.2514C12.1305 26.2514 11.8541 26.6436 11.8244 27.4281V27.7459C11.8047 28.0849 11.8776 28.423 12.0354 28.7237C12.0988 28.8324 12.1907 28.9217 12.3012 28.9819C12.4117 29.0421 12.5365 29.0709 12.6622 29.0652C12.7847 29.0687 12.9058 29.0392 13.0129 28.9797C13.12 28.9202 13.2091 28.8329 13.2708 28.7271C13.431 28.4314 13.5061 28.0972 13.4879 27.7614L13.4872 27.5647ZM16.1292 29.0179H17.9449V29.8205H15.0878V25.4927H16.1292V29.0179ZM19.1398 27.3713L19.9357 25.4927H21.0623L19.6686 28.2652V29.8205H18.6103V28.2652L17.22 25.4927H18.3405L19.1398 27.3713ZM24.8336 29.285C24.6384 29.4853 24.3961 29.6336 24.129 29.7164C23.8026 29.8282 23.4596 29.8835 23.1146 29.8801C22.8643 29.8921 22.6142 29.8521 22.3802 29.7626C22.1461 29.6731 21.9331 29.536 21.7547 29.36C21.3975 28.9637 21.2042 28.4464 21.2138 27.9129V27.5383C21.2051 27.1542 21.2823 26.773 21.4396 26.4225C21.5757 26.1197 21.7986 25.8642 22.08 25.6881C22.3739 25.513 22.7111 25.424 23.0531 25.4312C23.5021 25.4033 23.9466 25.5342 24.3088 25.8011C24.4652 25.9409 24.5919 26.1107 24.6815 26.3003C24.771 26.49 24.8216 26.6958 24.8302 26.9053H23.826C23.8126 26.7108 23.7304 26.5274 23.5941 26.388C23.4497 26.2779 23.2701 26.224 23.0889 26.2366C22.967 26.2323 22.8461 26.261 22.739 26.3195C22.632 26.3781 22.5426 26.4643 22.4803 26.5693C22.3207 26.8597 22.2455 27.1891 22.2633 27.52V27.7817C22.2417 28.1201 22.3195 28.4574 22.4871 28.7521C22.5656 28.8616 22.671 28.949 22.7931 29.0059C22.9152 29.0627 23.05 29.0871 23.1843 29.0767C23.4026 29.0942 23.6197 29.0296 23.7929 28.8955V28.2247H23.0673V27.5085H24.8329L24.8336 29.285ZM29.1039 27.7459C29.1116 28.1323 29.0314 28.5155 28.8693 28.8664C28.7258 29.1772 28.4936 29.4386 28.2019 29.6177C27.9044 29.7956 27.5631 29.8867 27.2166 29.8807C26.8727 29.8871 26.5336 29.7991 26.2361 29.6265C25.9481 29.4539 25.7164 29.2014 25.5693 28.8995C25.4049 28.5625 25.3191 28.1926 25.3184 27.8176V27.5741C25.3105 27.1874 25.3903 26.8038 25.5517 26.4523C25.6943 26.1392 25.9269 25.8758 26.2198 25.6956C26.5192 25.5168 26.8626 25.4252 27.2112 25.4312C27.556 25.4254 27.8956 25.5161 28.1917 25.6929C28.4825 25.8716 28.715 26.131 28.8612 26.4394C29.0259 26.7849 29.1088 27.1637 29.1033 27.5464L29.1039 27.7459ZM28.043 27.5647C28.0642 27.2245 27.9894 26.8852 27.8272 26.5855C27.7636 26.4798 27.6728 26.3932 27.5644 26.3344C27.456 26.2757 27.3338 26.247 27.2105 26.2514C26.6876 26.2514 26.4112 26.6436 26.3815 27.4281V27.7459C26.3618 28.0849 26.4347 28.423 26.5925 28.7237C26.6559 28.8324 26.7478 28.9217 26.8583 28.9819C26.9688 29.0421 27.0936 29.0709 27.2193 29.0652C27.3418 29.0687 27.4629 29.0392 27.57 28.9797C27.6771 28.9202 27.7662 28.8329 27.8279 28.7271C27.9881 28.4314 28.0632 28.0972 28.045 27.7614L28.043 27.5647ZM33.2553 29.8205H32.218L30.6843 27.1285V29.8205H29.6415V25.4927H30.6843L32.2146 28.1848V25.4927H33.2546L33.2553 29.8205Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

1
assets/logo/coinbase.svg Normal file
View File

@ -0,0 +1 @@
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="c"><stop stop-color="#2E66F8" offset="0%"/><stop stop-color="#124ADB" offset="100%"/></linearGradient><circle id="a" cx="59.928" cy="59.928" r="59.928"/></defs><g fill="none" fill-rule="evenodd"><path fill="#FFF" fill-rule="nonzero" d="M0 0h128v128H0z"/><path fill="#FFF" fill-rule="nonzero" d="M0 0h128v128H0z"/><path d="M0 0h128v128H0z"/><path d="M19 64c0 24.853 20.147 45 45 45s45-20.147 45-45-20.147-45-45-45-45 20.147-45 45zm33.5-14.5a3 3 0 00-3 3v23a3 3 0 003 3h23a3 3 0 003-3v-23a3 3 0 00-3-3h-23z" fill="#FFF"/><g transform="translate(4 4)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g mask="url(#b)"><path d="M0 0h119.856v119.856H0z"/><rect fill="url(#c)" fill-rule="nonzero" width="119.856" height="119.856" rx="48"/><path d="M24.97 59.928c0 19.307 15.651 34.958 34.958 34.958s34.958-15.651 34.958-34.958S79.235 24.97 59.928 24.97 24.97 40.62 24.97 59.928zm26.024-11.264a2.33 2.33 0 00-2.33 2.33v17.868a2.33 2.33 0 002.33 2.33h17.868a2.33 2.33 0 002.33-2.33V50.994a2.33 2.33 0 00-2.33-2.33H50.994z" fill="#FFF"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

3
assets/logo/compound.svg Normal file
View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.56159 11.9083C2.39017 11.8037 2.24851 11.6568 2.15018 11.4816C2.05184 11.3065 2.00013 11.1091 2 10.9083V8.63114C2.00005 8.54507 2.02279 8.46053 2.06592 8.38604C2.10905 8.31155 2.17105 8.24974 2.24567 8.20684C2.32029 8.16394 2.4049 8.14146 2.49097 8.14167C2.57705 8.14188 2.66155 8.16477 2.73596 8.20803L7.87486 11.2057C8.02237 11.2923 8.14469 11.416 8.2297 11.5644C8.31471 11.7128 8.35946 11.8809 8.35951 12.0519V14.4111C8.35951 14.5188 8.32874 14.6265 8.27489 14.7188C8.23465 14.7847 8.18184 14.842 8.11947 14.8874C8.0571 14.9328 7.98639 14.9655 7.91138 14.9836C7.83637 15.0017 7.75853 15.0049 7.6823 14.9929C7.60608 14.9809 7.53296 14.954 7.46713 14.9137L2.56159 11.9083ZM10.2212 7.58746C10.3687 7.67406 10.491 7.7977 10.5761 7.94614C10.6611 8.09457 10.7058 8.26264 10.7059 8.43369V13.2213C10.7059 13.3623 10.6289 13.4931 10.5058 13.5623L9.38011 14.1957C9.36729 14.2034 9.34934 14.2085 9.33395 14.2137V11.5519C9.33395 11.2083 9.15445 10.8877 8.85699 10.7108L4.34379 8.01058V5.01032C4.34384 4.92424 4.36658 4.8397 4.40971 4.76521C4.45284 4.69072 4.51484 4.62892 4.58946 4.58601C4.66408 4.54311 4.74869 4.52064 4.83476 4.52084C4.92084 4.52105 5.00534 4.54394 5.07975 4.58721L10.2212 7.58746ZM12.4701 4.05126C12.7727 4.22564 12.9573 4.54874 12.9573 4.89749V11.8904C12.9573 12.034 12.8778 12.1648 12.7522 12.234L11.6854 12.811V7.94134C11.6854 7.59772 11.5059 7.27974 11.211 7.10281L6.60039 4.3359V1.4895C6.60039 1.40232 6.62347 1.31769 6.6645 1.24333C6.80041 1.00998 7.10043 0.930481 7.33378 1.06639L12.4701 4.05126Z" fill="#0AD394"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
assets/logo/curve.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800"><linearGradient id="a" x1="322.323" x2="453.787" y1="405.315" y2="872.74" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#f44336"/><stop offset=".123" stop-color="#f66342"/><stop offset=".392" stop-color="#fbb45f"/><stop offset=".578" stop-color="#fef075"/><stop offset=".596" stop-color="#f2ed7c"/><stop offset=".707" stop-color="#acdaa7"/><stop offset=".806" stop-color="#75cbc9"/><stop offset=".891" stop-color="#4dc0e1"/><stop offset=".959" stop-color="#34b9f0"/><stop offset="1" stop-color="#2bb7f6"/></linearGradient><path fill="url(#a)" d="M704.9 372.1c-1.3-22.7-6.4-40.9-10.3-52.4 0 0-7.9-22-22.2-42.6-50.9-73.6-191.6-131.6-216.9-142-29.8-12.3-59.8-21.2-59.8-21.2-7.7-2.3-15.8-4.6-24.5-6.8-36.9-9.3-69-13.7-92.9-15.8-11.6-1-49.9.4-86.7 21.6-55.5 31.9-74.1 91.6-85.8 129C91.7 286.7 91 325.4 91 356.7c0 24.4 1.6 52.1 6 82.5 3 20.5 8.9 59.8 25.5 105 18.1 49.7 55.5 152 127.4 162.6 6.3.9 18.4 2.5 32.9-1.7 56.2-16 91.6-102.6 93-214.7 1.3-25.3 1.2-54.6-1.8-87-1.9-20.2-5-52.6-16.5-93.4-8.3-29.5-18.1-53.6-26.1-71-4-12.5-6.3-27.4 1.2-36.3 15.9-18.6 66.3.1 115.7 18.9A822.1 822.1 0 01569 279.4c36.6 26.5 37.8 42.5 36.4 49.7-5.5 28.1-71.6 40.2-130.8 50.8-30.9 5.6-46 10-64.1 8.3-13.3-1.2-18.5-3.6-23.6.2-11.9 8.8.8 33 .7 82.5 0 17.4-1.7 36.5-2.5 45.8-2.8 33-6.6 51.5 1.7 56.3 3.9 2.2 8.6.4 13.3-1.4 18-6.7 36.7-11.4 55.2-16.4 49.1-13.1 97.8-25.3 113.2-29.2 21.7-4 39.3-9.2 51.9-13.4 22.3-7.4 35.4-12.9 47.7-23.1 41.4-33.8 37.8-100.1 36.8-117.4zm-432.8 283c-45.1 10.7-97-45.5-116-125.6s2.1-153.6 47.2-164.3 97 45.5 116 125.6c18.9 80-2.2 153.6-47.2 164.3z"/><linearGradient id="b" x1="196.24" x2="257.764" y1="685.638" y2="904.518" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset=".392" stop-color="#fef075"/><stop offset=".418" stop-color="#f2ed7c"/><stop offset=".577" stop-color="#acdaa7"/><stop offset=".721" stop-color="#75cbc9"/><stop offset=".844" stop-color="#4dc0e1"/><stop offset=".941" stop-color="#34b9f0"/><stop offset="1" stop-color="#2bb7f6"/></linearGradient><path fill="url(#b)" d="M186.5 422.2c-42.1 46.7.3 139.6 5 149.5 13.4 28.5 27.4 39.8 39.2 45.8a77.3 77.3 0 0028.3 7.8c3.1-.2 10-.9 17-5.6 6.2-4.1 9.4-9.3 10.9-12a148.1 148.1 0 01-40.6-36.8c-2.7-3.5-51.3-70.2-22.4-126.9 7.8-15.3 19-25.5 28.1-32.1-4.1-3.9-11.2-9.3-21-10.8-22.4-3.5-40.9 17-44.5 21.1z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

4
assets/logo/default.svg Normal file
View File

@ -0,0 +1,4 @@
<svg viewBox="0 0 56 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28C0 43.464 12.536 56 28 56Z" fill="#ECF1FF" fill-opacity="0.75"/>
<path d="M38.4203 21H19.0625C18.6136 21 18.25 20.6084 18.25 20.125C18.25 19.6416 18.6136 19.25 19.0625 19.25H38.5625C39.0114 19.25 39.375 18.8584 39.375 18.375C39.375 16.9252 38.2837 15.75 36.9375 15.75H18.25C16.4549 15.75 15 17.3168 15 19.25V36.75C15 38.6832 16.4549 40.25 18.25 40.25H38.4203C39.8432 40.25 41 39.0726 41 37.625V23.625C41 22.1774 39.8432 21 38.4203 21ZM36.125 32.375C35.2277 32.375 34.5 31.5913 34.5 30.625C34.5 29.6587 35.2277 28.875 36.125 28.875C37.0223 28.875 37.75 29.6587 37.75 30.625C37.75 31.5913 37.0223 32.375 36.125 32.375Z" fill="#3F75FF"/>
</svg>

After

Width:  |  Height:  |  Size: 803 B

3
assets/logo/discord.svg Normal file
View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.06 4.10884C11.848 3.16763 9.9315 3.00819 9.8505 3.00143C9.7225 2.9908 9.601 3.06086 9.5485 3.17392C9.5465 3.17778 9.4395 3.47782 9.336 3.76724C10.7445 4.00544 11.7015 4.53402 11.7525 4.56301C11.9915 4.69733 12.0715 4.99351 11.932 5.22398C11.8395 5.37762 11.672 5.46362 11.5 5.46362C11.4145 5.46362 11.3285 5.44285 11.2495 5.3984C11.2355 5.39018 9.8315 4.61809 8.001 4.61809C6.17 4.61809 4.7655 5.39067 4.7515 5.3984C4.513 5.53223 4.207 5.45348 4.0685 5.22253C3.93 4.99254 4.0105 4.69733 4.2485 4.56301C4.2995 4.53402 5.26 4.00351 6.6725 3.76579C6.5635 3.47299 6.4535 3.17778 6.4515 3.17392C6.399 3.06037 6.2775 2.98886 6.1495 3.00143C6.0685 3.00771 4.152 3.16715 2.924 4.1214C2.282 4.69443 1 8.04468 1 10.9412C1 10.9925 1.0135 11.0422 1.04 11.0867C1.9255 12.5893 4.3395 12.9826 4.8895 12.9995C4.893 13 4.896 13 4.899 13C4.996 13 5.0875 12.9551 5.145 12.8792L5.74 12.1004C4.435 11.7964 3.745 11.3186 3.7035 11.2891C3.4815 11.1311 3.4335 10.8287 3.597 10.6137C3.76 10.3996 4.072 10.3523 4.294 10.5093C4.3125 10.5209 5.586 11.3824 8 11.3824C10.4235 11.3824 11.6935 10.5175 11.706 10.5088C11.928 10.3532 12.241 10.4001 12.4035 10.6156C12.5655 10.8301 12.5185 11.1306 12.2975 11.2882C12.256 11.3176 11.5695 11.7945 10.2675 12.0984L10.855 12.8787C10.9125 12.9551 11.004 12.9995 11.101 12.9995C11.1045 12.9995 11.1075 12.9995 11.1105 12.999C11.661 12.9821 14.075 12.5888 14.96 11.0862C14.9865 11.0417 15 10.992 15 10.9408C15 8.04468 13.718 4.69443 13.06 4.10884ZM6 9.93288C5.4475 9.93288 5 9.39222 5 8.72497C5 8.05773 5.4475 7.51707 6 7.51707C6.5525 7.51707 7 8.05773 7 8.72497C7 9.39222 6.5525 9.93288 6 9.93288ZM10 9.93288C9.4475 9.93288 9 9.39222 9 8.72497C9 8.05773 9.4475 7.51707 10 7.51707C10.5525 7.51707 11 8.05773 11 8.72497C11 9.39222 10.5525 9.93288 10 9.93288Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,12 @@
<svg viewBox="0 0 412 58" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 6.72772H12.8057V52.0002H0V6.72772Z" fill="currentColor"/>
<path d="M64.9898 6.72772V52.0002H54.4478L34.4632 27.8764V52.0002H21.9162V6.72772H32.4583L52.4429 30.8515V6.72772H64.9898Z" fill="currentColor"/>
<path d="M89.9326 52.9057C86.2677 52.9057 82.7106 52.453 79.2613 51.5475C75.8119 50.6421 73.0093 49.4348 70.8535 47.9257L75.0574 38.4832C77.0839 39.8198 79.4337 40.8977 82.107 41.7169C84.7802 42.5361 87.4103 42.9457 89.9973 42.9457C94.9126 42.9457 97.3703 41.7169 97.3703 39.2593C97.3703 37.9658 96.6588 37.0172 95.236 36.4136C93.8563 35.7668 91.6142 35.0985 88.5098 34.4086C85.1036 33.6756 82.2579 32.8995 79.9727 32.0803C77.6875 31.218 75.7257 29.8598 74.0873 28.0058C72.4488 26.1518 71.6296 23.651 71.6296 20.5035C71.6296 17.744 72.3842 15.2648 73.8932 13.0659C75.4023 10.8238 77.6444 9.05602 80.6194 7.76252C83.6376 6.46902 87.3241 5.82227 91.6789 5.82227C94.6539 5.82227 97.5859 6.1672 100.475 6.85707C103.363 7.50382 105.907 8.47394 108.106 9.76744L104.161 19.2747C99.8495 16.9464 95.6672 15.7822 91.6142 15.7822C89.0703 15.7822 87.2163 16.1703 86.0521 16.9464C84.888 17.6794 84.3059 18.6495 84.3059 19.8567C84.3059 21.064 84.9958 21.9695 86.3755 22.5731C87.7552 23.1767 89.9758 23.8019 93.037 24.4487C96.4864 25.1817 99.3321 25.9793 101.574 26.8416C103.859 27.6609 105.821 28.9975 107.46 30.8515C109.141 32.6624 109.982 35.1416 109.982 38.2891C109.982 41.0055 109.227 43.4631 107.718 45.6621C106.209 47.861 103.946 49.6288 100.927 50.9654C97.9092 52.2589 94.2443 52.9057 89.9326 52.9057Z" fill="currentColor"/>
<path d="M124.902 16.8817H110.997V6.72772H151.548V16.8817H137.708V52.0002H124.902V16.8817Z" fill="currentColor"/>
<path d="M184.378 43.2044H165.234L161.677 52.0002H148.613L168.597 6.72772H181.209L201.258 52.0002H187.935L184.378 43.2044ZM180.627 33.7619L174.806 19.2747L168.985 33.7619H180.627Z" fill="currentColor"/>
<path d="M234.26 55C234.26 56.6569 235.607 58.0163 237.255 57.8472C251.864 56.3482 263.26 44.0049 263.26 29C263.26 13.9951 251.864 1.6518 237.255 0.152804C235.607 -0.0163155 234.26 1.34315 234.26 3V11C234.26 12.6569 235.616 13.9687 237.241 14.2962C244.097 15.6786 249.26 21.7364 249.26 29C249.26 36.2636 244.097 42.3214 237.241 43.7038C235.616 44.0313 234.26 45.3431 234.26 47V55Z" fill="#3F75FF"/>
<path d="M225.26 5.55782C225.26 3.51831 223.263 2.08002 221.434 2.98319C211.851 7.71639 205.26 17.5885 205.26 29.0002C205.26 40.4118 211.851 50.2839 221.434 55.0171C223.263 55.9203 225.26 54.482 225.26 52.4425V5.55782Z" fill="#3F75FF"/>
<path d="M303.12 43.2043H283.976L280.419 52.0001H267.354L287.339 6.72754H299.951L320 52.0001H306.677L303.12 43.2043ZM299.369 33.7617L293.548 19.2745L287.727 33.7617H299.369Z" fill="currentColor"/>
<path d="M344.326 6.72754C348.422 6.72754 351.98 7.41741 354.998 8.79714C358.016 10.1338 360.344 12.074 361.983 14.6179C363.621 17.1187 364.44 20.0722 364.44 23.4784C364.44 26.8846 363.621 29.8381 361.983 32.3388C360.344 34.8396 358.016 36.7799 354.998 38.1596C351.98 39.4962 348.422 40.1645 344.326 40.1645H336.436V52.0001H323.63V6.72754H344.326ZM343.55 30.0752C346.18 30.0752 348.164 29.5147 349.5 28.3937C350.837 27.2295 351.505 25.5911 351.505 23.4784C351.505 21.3657 350.837 19.7272 349.5 18.5631C348.164 17.3989 346.18 16.8168 343.55 16.8168H336.436V30.0752H343.55Z" fill="currentColor"/>
<path d="M391.38 6.72754C395.476 6.72754 399.033 7.41741 402.051 8.79714C405.069 10.1338 407.398 12.074 409.036 14.6179C410.675 17.1187 411.494 20.0722 411.494 23.4784C411.494 26.8846 410.675 29.8381 409.036 32.3388C407.398 34.8396 405.069 36.7799 402.051 38.1596C399.033 39.4962 395.476 40.1645 391.38 40.1645H383.49V52.0001H370.684V6.72754H391.38ZM390.604 30.0752C393.234 30.0752 395.217 29.5147 396.554 28.3937C397.891 27.2295 398.559 25.5911 398.559 23.4784C398.559 21.3657 397.891 19.7272 396.554 18.5631C395.217 17.3989 393.234 16.8168 390.604 16.8168H383.49V30.0752H390.604Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 38.2752C20 39.268 20.8046 40.0812 21.7899 39.9935C31.997 39.0849 40 30.4805 40 20C40 9.51953 31.997 0.915054 21.7899 0.00648919C20.8046 -0.0812148 20 0.731997 20 1.72476V7.81995C20 8.81272 20.8084 9.60123 21.783 9.77115C26.6466 10.6192 30.3448 14.8761 30.3448 20C30.3448 25.1239 26.6466 29.3808 21.783 30.2288C20.8084 30.3988 20 31.1873 20 32.18V38.2752Z" fill="currentColor"/>
<path d="M13.7931 3.38976C13.7931 2.16772 12.6019 1.30513 11.5 1.82512C4.70451 5.03194 0 11.9646 0 20.0001C0 28.0356 4.70451 34.9683 11.5 38.1751C12.6019 38.6951 13.7931 37.8325 13.7931 36.6105V3.38976Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 720 B

View File

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 38.2752C20 39.268 20.8046 40.0812 21.7899 39.9935C31.997 39.0849 40 30.4805 40 20C40 9.51953 31.997 0.915054 21.7899 0.00648919C20.8046 -0.0812148 20 0.731997 20 1.72476V7.81995C20 8.81272 20.8084 9.60123 21.783 9.77115C26.6466 10.6192 30.3448 14.8761 30.3448 20C30.3448 25.1239 26.6466 29.3808 21.783 30.2288C20.8084 30.3988 20 31.1873 20 32.18V38.2752Z" fill="#3F75FF"/>
<path d="M13.7931 3.38976C13.7931 2.16772 12.6019 1.30513 11.5 1.82512C4.70451 5.03194 0 11.9646 0 20.0001C0 28.0356 4.70451 34.9683 11.5 38.1751C12.6019 38.6951 13.7931 37.8325 13.7931 36.6105V3.38976Z" fill="#3F75FF"/>
</svg>

After

Width:  |  Height:  |  Size: 710 B

1
assets/logo/kyber.svg Normal file
View File

@ -0,0 +1 @@
<svg width="28" height="28" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="a"><stop stop-color="#31CB9E" offset="0%"/><stop stop-color="#2FC99E" offset="4%"/><stop stop-color="#18B2A1" offset="63%"/><stop stop-color="#0FAAA2" offset="100%"/></linearGradient><path d="M3.957 9.478L5.852.861C5.926.524 5.53.278 5.249.488L.396 4.108a.975.975 0 00-.396.78v9.18c0 .306.146.595.396.781l4.853 3.62c.281.209.677-.037.603-.374L3.957 9.478z" id="b"/></defs><g fill="none" fill-rule="evenodd"><circle fill="url(#a)" cx="14" cy="14" r="14"/><g transform="translate(7 4.667)" fill="#FFF"><path d="M5.812 9.478l7.242 4.062c.254.142.57-.037.57-.323v-7.48c0-.286-.316-.465-.57-.323L5.812 9.478zm6.827-5.81L7.823.076a.383.383 0 00-.603.218L5.462 8.29l7.135-4.004a.367.367 0 00.042-.618M7.822 18.88l4.82-3.594a.367.367 0 00-.041-.618l-7.139-4.003 1.758 7.997c.059.267.38.383.602.218"/><use xlink:href="#b"/></g></g></svg>

After

Width:  |  Height:  |  Size: 996 B

3
assets/logo/makerdao.svg Normal file
View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.768 4.702V10.836C13.768 10.836 13.802 11.504 13.256 11.504C12.71 11.504 12.818 10.846 12.818 10.846V5.798C12.818 5.798 12.866 5.24 12.598 5.506C12.33 5.772 9.532 7.626 9.532 7.626C9.532 7.626 9.24 7.76 9.24 8.21V11.062C9.24 11.062 9.33 11.574 8.802 11.574C8.802 11.574 8.436 11.58 8.436 11.282V7.918C8.436 7.918 8.392 7.552 8.802 7.26C9.212 6.968 13.11 4.336 13.11 4.336C13.11 4.336 13.734 4.064 13.768 4.702V4.702ZM7.562 11.282V8.066C7.562 8.066 7.562 7.638 7.196 7.408L2.816 4.336C2.816 4.336 2.304 4.114 2.232 4.628V11.21C2.232 11.21 2.22 11.568 2.524 11.648C2.524 11.648 3.036 11.818 3.036 11.136V5.872C3.036 5.872 2.97 5.47 3.328 5.726C3.686 5.982 6.468 7.92 6.468 7.92C6.468 7.92 6.688 8.008 6.688 8.286V11.284C6.688 11.284 6.658 11.726 7.126 11.722C7.592 11.718 7.562 11.282 7.562 11.282Z" fill="#1AAB9A"/>
</svg>

After

Width:  |  Height:  |  Size: 908 B

3
assets/logo/polygon.svg Normal file
View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.6572 14.5486C28.3311 14.374 27.964 14.2824 27.5906 14.2824C27.2172 14.2824 26.8501 14.374 26.5241 14.5486L21.6305 17.2712L18.3068 19.0475L13.4132 21.77C13.0872 21.9446 12.72 22.0362 12.3467 22.0362C11.9733 22.0362 11.6062 21.9446 11.2801 21.77L7.39035 19.6396C7.07396 19.4654 6.80966 19.2161 6.62286 18.9155C6.43606 18.6149 6.33307 18.2733 6.32382 17.9234V13.7241C6.31954 13.3716 6.41689 13.0248 6.60509 12.7219C6.7933 12.4191 7.06503 12.1721 7.39035 12.008L11.2174 9.93638C11.5434 9.76182 11.9106 9.67018 12.2839 9.67018C12.6573 9.67018 13.0244 9.76182 13.3505 9.93638L17.1775 12.008C17.4941 12.182 17.7586 12.4313 17.9454 12.7319C18.1322 13.0325 18.2351 13.3743 18.2441 13.7241V16.4453L21.5677 14.6116V11.8891C21.5722 11.5365 21.4749 11.1896 21.2867 10.8867C21.0985 10.5839 20.8266 10.3368 20.5012 10.1729L13.4132 6.26619C13.0872 6.09163 12.72 6 12.3467 6C11.9733 6 11.6062 6.09163 11.2801 6.26619L4.06671 10.1729C3.74139 10.337 3.46961 10.584 3.28141 10.8868C3.0932 11.1897 2.99586 11.5365 3.00014 11.8891V19.7613C2.99586 20.1139 3.0932 20.4607 3.28141 20.7635C3.46961 21.0664 3.74139 21.3134 4.06671 21.4775L11.2801 25.3842C11.6062 25.5588 11.9733 25.6504 12.3467 25.6504C12.72 25.6504 13.0872 25.5588 13.4132 25.3842L18.3068 22.7246L21.6305 20.8896L26.5241 18.23C26.8501 18.0554 27.2172 17.9638 27.5906 17.9638C27.964 17.9638 28.3311 18.0554 28.6572 18.23L32.4842 20.3016C32.8005 20.4757 33.0647 20.7251 33.2512 21.0257C33.4378 21.3263 33.5405 21.668 33.5493 22.0178V26.2171C33.5537 26.5695 33.4566 26.9162 33.2686 27.219C33.0807 27.5218 32.8092 27.769 32.4842 27.9332L28.6572 30.0636C28.3311 30.2382 27.964 30.3298 27.5906 30.3298C27.2172 30.3298 26.8501 30.2382 26.5241 30.0636L22.697 27.992C22.3806 27.8178 22.1163 27.5685 21.9295 27.2679C21.7427 26.9673 21.6397 26.6257 21.6305 26.2759V23.5533L18.3068 25.3884V28.1109C18.3023 28.4635 18.3996 28.8104 18.5878 29.1133C18.7761 29.4161 19.0479 29.6632 19.3734 29.827L26.5868 33.7338C26.9128 33.9084 27.28 34 27.6533 34C28.0267 34 28.3939 33.9084 28.7199 33.7338L35.9333 29.827C36.2499 29.6531 36.5144 29.4038 36.7012 29.1032C36.888 28.8026 36.9909 28.4608 36.9999 28.1109V20.2247C37.0041 19.8721 36.9068 19.5253 36.7186 19.2225C36.5304 18.9196 36.2587 18.6726 35.9333 18.5085L28.6572 14.5486Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

4
assets/logo/uniswap.svg Normal file
View File

@ -0,0 +1,4 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.39837 7.23184C7.70419 7.76948 7.0229 7.9356 6.70192 7.9658C6.21741 8.01413 6.1175 7.73323 6.21137 7.38285C6.24165 7.256 6.3113 7.14425 6.4082 7.05968C6.50509 6.9751 6.6262 6.92072 6.75642 6.90865C6.8836 6.89657 7.01078 6.92072 7.12584 6.97811C7.23787 7.03249 7.33176 7.12309 7.39837 7.23184ZM9.29999 6.23811C8.94571 8.95349 13.721 8.38867 13.6301 10.5483C14.1025 9.93513 14.3023 8.26786 12.9155 7.41004C11.6831 6.64284 10.0722 7.06269 9.29999 6.23811ZM12.0525 5.21419C12.0222 5.18396 11.9889 5.1568 11.9586 5.12961C11.9889 5.1568 12.0222 5.187 12.0525 5.21419ZM13.1608 7.19258L13.1577 7.18954C13.1158 7.10842 13.0661 7.03155 13.0094 6.95999C12.8483 6.74174 12.6176 6.58508 12.3553 6.51599C12.1797 6.47068 12.001 6.44351 11.8224 6.43141C11.6407 6.41933 11.453 6.41027 11.2652 6.40121C10.8897 6.38007 10.5021 6.34081 10.1266 6.23509C10.0328 6.2079 9.9389 6.1777 9.84807 6.14447C9.79963 6.12636 9.75723 6.10824 9.71181 6.09011C9.66638 6.06897 9.61793 6.04781 9.56948 6.02366C9.39084 5.92701 9.22732 5.80618 9.08198 5.66725C8.79129 5.39539 8.56417 5.09035 8.33405 4.79132C8.11905 4.49228 7.88891 4.20536 7.64061 3.9335C7.39837 3.66468 7.11069 3.44117 6.79275 3.26901C6.46269 3.10259 6.10412 3.00011 5.73596 2.96697C6.1175 2.92467 6.50206 2.973 6.8624 3.1059C7.22578 3.24787 7.55885 3.4593 7.84046 3.72812C8.02461 3.90119 8.19756 4.0858 8.35826 4.28085C9.55435 4.04527 10.5264 4.25368 11.2713 4.66143L11.2894 4.6705C11.5256 4.80037 11.7497 4.95443 11.9526 5.13262C11.9859 5.15981 12.0162 5.19001 12.0464 5.2172C12.2039 5.36218 12.3523 5.52227 12.4885 5.68839L12.4976 5.7035C12.9427 6.25924 13.1608 6.83918 13.1608 7.19258V7.19258ZM13.1608 7.19258L13.1577 7.18653L13.1608 7.19258Z" fill="#FF007A"/>
<path d="M5.8043 3.31486C6.11022 3.36022 6.42222 3.48116 6.62214 3.71402C6.82205 3.94685 6.89779 4.24926 6.95534 4.53653C7.00381 4.7603 7.04016 4.98711 7.12799 5.19878C7.17039 5.30159 7.23401 5.39231 7.2855 5.48907C7.32792 5.57073 7.40667 5.64329 7.43695 5.72797C7.44302 5.74007 7.44302 5.75518 7.44302 5.76727C7.43999 5.77937 7.43695 5.7945 7.42787 5.80357C7.32185 5.9215 7.03409 5.79147 6.92505 5.73703C6.73725 5.64329 6.57064 5.5163 6.4313 5.35906C5.99512 4.87522 5.77098 4.17667 5.78611 3.54165C5.78611 3.46605 5.79218 3.39046 5.8043 3.31486V3.31486ZM10.9113 8.77611C10.2509 10.6237 13.2437 11.8605 12.1229 13.7384C13.274 13.2606 13.8192 11.8243 13.3436 10.6812C12.9256 9.68028 11.6897 9.31438 10.9113 8.77611ZM6.95534 11.1922C7.13459 11.0559 7.33118 10.9441 7.53994 10.8596C7.75137 10.7751 7.97048 10.7113 8.19421 10.6691C8.63646 10.5844 9.07568 10.5633 9.44522 10.4151C9.62696 10.3425 9.79357 10.2397 9.93895 10.1066C10.0783 9.97661 10.1873 9.81332 10.2509 9.6349C10.3176 9.44441 10.3449 9.2418 10.3297 9.04222C10.3146 8.82751 10.2631 8.61282 10.1843 8.41324C10.3479 8.58561 10.469 8.79425 10.5327 9.02407C10.5963 9.25389 10.6053 9.4928 10.5539 9.72563C10.4963 9.97056 10.3721 10.1974 10.1934 10.3758C10.0173 10.5488 9.80533 10.681 9.57244 10.7628C9.35132 10.8415 9.11808 10.8898 8.88485 10.905C8.65766 10.9231 8.43957 10.9292 8.22451 10.9413C7.79135 10.9564 7.36425 11.0441 6.95534 11.1922V11.1922ZM11.1748 14.4369C11.1082 14.4914 11.0415 14.5458 10.9688 14.5942C10.8961 14.6426 10.8174 14.6849 10.7386 14.7242C10.572 14.8059 10.3903 14.8482 10.2055 14.8452C9.7027 14.8361 9.34828 14.4611 9.14231 14.0378C8.99996 13.7505 8.90302 13.439 8.73641 13.1639C8.49712 12.7708 8.08518 12.4563 7.60657 12.5137C7.4097 12.5379 7.22794 12.6256 7.11891 12.798C6.83115 13.2425 7.2431 13.8684 7.76711 13.7807C7.85711 13.7688 7.94204 13.7322 8.01247 13.6749C8.08518 13.6144 8.13969 13.5328 8.17301 13.4421C8.20633 13.3483 8.21543 13.2455 8.19421 13.1487C8.17301 13.0459 8.11244 12.9552 8.02459 12.8977C8.12454 12.9461 8.20331 13.0308 8.24268 13.1336C8.2851 13.2395 8.29418 13.3574 8.27298 13.4693C8.25193 13.5862 8.20078 13.6956 8.12456 13.7868C8.04126 13.8797 7.93456 13.9487 7.81558 13.9864C7.69746 14.0257 7.57024 14.0408 7.44604 14.0257C7.27189 14.0012 7.10759 13.9302 6.97049 13.8201C6.80692 13.69 6.68878 13.5237 6.54036 13.3786C6.37186 13.2026 6.17405 13.0573 5.95575 12.9492C5.80439 12.8827 5.64582 12.834 5.48322 12.804C5.40143 12.7859 5.31965 12.7738 5.23786 12.7647C5.20151 12.7617 5.01674 12.7193 4.98947 12.7435C5.24396 12.5079 5.52209 12.2991 5.81943 12.1206C6.12538 11.9392 6.45252 11.8001 6.79176 11.7033C7.14616 11.6035 7.5157 11.5763 7.8792 11.6186C8.06678 11.6399 8.25037 11.6877 8.42444 11.7607C8.60919 11.8333 8.7758 11.9392 8.92422 12.0722C9.06963 12.2113 9.18775 12.3746 9.27257 12.5591C9.34828 12.7314 9.40282 12.9098 9.43917 13.0943C9.54517 13.6447 9.50581 14.4974 10.2237 14.6214C10.26 14.6275 10.2994 14.6335 10.3358 14.6365L10.4539 14.6396C10.5357 14.6335 10.6144 14.6214 10.6932 14.6063C10.8628 14.5609 11.0203 14.5065 11.1748 14.4369V14.4369ZM7.00381 13.8382L6.98562 13.8231L7.00381 13.8382ZM6.36163 6.08177C6.33438 6.18156 6.28895 6.27832 6.22836 6.35998C6.11326 6.51117 5.95877 6.62911 5.7831 6.70169C5.62518 6.77031 5.45762 6.81416 5.28633 6.8317C5.24927 6.83773 5.21179 6.84077 5.17424 6.84078C5.06521 6.8438 4.96222 6.88312 4.8774 6.95267C4.79226 7.02065 4.73077 7.11378 4.70171 7.21878C4.68944 7.27161 4.68034 7.32512 4.67446 7.37903C4.65627 7.51815 4.65326 7.66329 4.63811 7.83868C4.60071 8.13594 4.51476 8.42505 4.38367 8.69446C4.21404 9.05431 4.0232 9.34462 4.06562 9.75889C4.09591 10.028 4.23221 10.2095 4.41395 10.3939C4.74413 10.7326 5.48322 10.8838 5.31661 11.7184C5.21666 12.2174 4.39578 12.7375 3.23868 12.9219C3.35378 12.9038 3.09025 12.4593 3.0751 12.4321C2.95092 12.2385 2.81461 12.0541 2.71767 11.8424C2.52382 11.4311 2.43598 10.9594 2.51473 10.5088C2.59956 10.0371 2.94788 9.67423 3.23566 9.31438C3.58097 8.88498 3.94142 8.32251 4.0232 7.76308C4.04139 7.627 4.05652 7.45766 4.08682 7.29134C4.11407 7.10386 4.17466 6.92546 4.25948 6.75611C4.31703 6.64725 4.39578 6.54746 4.48665 6.46279C4.53514 6.41856 4.56723 6.35921 4.57768 6.29442C4.58813 6.22962 4.57633 6.1632 4.5442 6.10597L2.69951 2.77962L5.3469 6.05758C5.37681 6.09579 5.41495 6.12678 5.45847 6.14825C5.502 6.16971 5.5498 6.1811 5.59833 6.18156C5.64636 6.18282 5.69408 6.17345 5.73807 6.1541C5.78206 6.13476 5.82123 6.10593 5.85277 6.06968C5.88608 6.03037 5.90425 5.98198 5.90728 5.93056C5.90728 5.87916 5.89213 5.82776 5.86185 5.78845C5.68919 5.5677 5.50744 5.34091 5.32873 5.12015L4.66234 4.2916L3.3235 2.64051L1.5 0.345337L3.49615 2.49233L4.9198 4.07084L5.62861 4.86312C5.86486 5.12923 6.10114 5.38626 6.33438 5.66749L6.37375 5.71587L6.38285 5.78845C6.3889 5.8822 6.38285 5.98198 6.36163 6.08177V6.08177Z" fill="#FF007A"/>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

31
components/Badge.vue Normal file
View File

@ -0,0 +1,31 @@
<template>
<div
class="flex items-center justify-center flex-shrink-0 px-2 py-1 leading-none whitespace-no-wrap transition-colors duration-75 ease-out select-none xxl:font-semibold rounded-xs"
:class="{
'text-9': !large,
'text-12': large,
'bg-green-pure text-green-light dark:bg-opacity-17 dark:text-light': color === 'green-pure',
'bg-grey-pure bg-opacity-17 text-grey-pure': color === 'grey',
'bg-blue-pure bg-opacity-20 text-blue-pure': color === 'blue',
'bg-green-pure bg-opacity-20 text-green-pure': color === 'green',
'bg-yellow-pure bg-opacity-25 text-yellow-pure': color === 'yellow',
'bg-orange-pure bg-opacity-25 text-orange-pure': color === 'orange',
'bg-passion-orange-pure bg-opacity-25 text-passion-orange-pure': color === 'passion-orange',
'bg-red-pure dark:bg-opacity-25 text-white dark:text-light': color === 'red',
'bg-red-800 bg-opacity-25 text-red-800': color === 'red-dark',
}"
>
<slot />
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({
props: {
color: { type: String, default: null },
large: { type: Boolean, default: false },
},
})
</script>

49
components/Button.vue Normal file
View File

@ -0,0 +1,49 @@
<template>
<!-- prettier-ignore -->
<button
class="flex items-center justify-center flex-shrink-0 font-semibold whitespace-no-wrap transition-colors duration-75 ease-out select-none disabled:opacity-50 focus:outline-none rounded-xs text-11 xxl:text-12"
:class="{
'py-1': !large && !noPadding,
'py-2': large && !noPadding,
'rounded-full': round,
'pointer-events-none bg-grey-pure bg-opacity-10 dark:bg-grey-pure dark:bg-opacity-10 text-grey-pure':disabled || loading,
'bg-white bg-opacity-100 text-brand active:bg-grey-light dark:active:bg-white hover:text-ocean-blue-pure hover:bg-opacity-50 dark:active:bg-opacity-38 dark:hover:bg-opacity-25 dark:text-light dark:bg-opacity-10': color === 'white' && !disabled && !loading,
'bg-grey-light bg-opacity-25 hover:bg-opacity-50 focus:bg-opacity-50 active:bg-opacity-75 text-ocean-blue-pure dark:text-white': color === 'grey-light',
'bg-grey-pure bg-opacity-10 hover:bg-opacity-17 focus:bg-opacity-17': color === 'grey',
'bg-purple-pure bg-opacity-10 dark:bg-opacity-20 hover:bg-opacity-25 focus:bg-opacity-25 dark:hover:bg-opacity-38 dark:focus:bg-opacity-38 text-purple-pure': color === 'purple',
'bg-ocean-blue-pure bg-opacity-10 dark:bg-opacity-17 hover:bg-opacity-25 focus:bg-opacity-25 active:bg-opacity-38 dark:active:bg-opacity-38 dark:hover:bg-opacity-25 dark:focus:bg-opacity-25 text-ocean-blue-pure': color === 'ocean-blue',
'bg-blue-pure bg-opacity-10 dark:bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 dark:hover:bg-opacity-25 dark:focus:bg-opacity-25 text-blue-pure': color === 'blue',
'bg-green-pure bg-opacity-10 hover:bg-opacity-20 focus:bg-opacity-20 text-green-pure': color === 'green',
'bg-yellow-pure bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 text-yellow-pure': color === 'yellow',
'bg-orange-pure bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 text-orange-pure': color === 'orange',
'bg-passion-orange-pure bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 text-passion-orange-pure': color === 'passion-orange',
'bg-red-600 bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 text-red-600': color === 'red',
'bg-red-800 bg-opacity-10 hover:bg-opacity-25 focus:bg-opacity-25 text-red-800': color === 'red-dark',
}"
v-bind="$attrs"
:disabled="disabled || loading"
v-on="$listeners"
>
<SVGSpinner v-if="loading" class="h-3 animate-spin-loading" />
<slot v-else/>
</button>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import SVGSpinner from '@/assets/icons/spinner.svg'
export default defineComponent({
components: {
SVGSpinner,
},
props: {
disabled: { type: Boolean, default: false },
color: { type: String, default: null },
large: { type: Boolean, default: false },
round: { type: Boolean, default: false },
loading: { type: Boolean, default: false },
noPadding: { type: Boolean, default: false },
},
})
</script>

View File

@ -1,5 +1,5 @@
<template>
<dive class="flex-shrink-0 shadow bg-white relative flex flex-col flex-1 px-4 pt-4 pb-6 dark:bg-dark-500">
<div class="flex-shrink-0 shadow bg-white relative flex flex-col flex-1 px-4 pt-4 pb-6 dark:bg-dark-500">
<div class="flex items-center h-14">
<div class="flex mr-4 -space-x-3 overflow-hidden">
<IconCurrency :currency="tokenKey" class="w-12 h-12" no-height />
@ -147,7 +147,7 @@
>Payback</Button
>
</div>
</dive>
</div>
</template>
<script>

25
components/Divider.vue Normal file
View File

@ -0,0 +1,25 @@
<template>
<div v-if="vertical" class="w-px bg-grey-light dark:bg-opacity-38"></div>
<div v-else class="flex items-center justify-center w-full">
<hr class="w-full mt-0" />
<div v-if="$slots.default" class="flex items-center justify-center">
<span class="px-4 font-medium leading-none text-14 text-grey-pure">
<slot></slot>
</span>
</div>
<hr class="w-full mt-0" />
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({
props: {
vertical: {
type: Boolean,
default: false,
},
},
})
</script>

View File

@ -0,0 +1,33 @@
<template>
<div
class="flex items-center justify-center flex-shrink-0 rounded-full"
:class="{
'bg-opacity-10': !noOpacity,
'w-12 h-12': large,
'w-10 h-10': !large,
}"
>
<Icon
:type="type"
:name="name"
:class="{
'h-6': !iconClass,
[iconClass]: !!iconClass,
}"
/>
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({
props: {
name: { type: String, required: true },
type: { type: String, default: 'outline' },
noOpacity: { type: Boolean, default: false },
large: { type: Boolean, default: true },
iconClass: { type: String },
},
})
</script>

View File

@ -0,0 +1,63 @@
<template>
<div class="inline-flex justify-center item-center">
<IconBackground
v-if="icon === 'error'"
name="exclamation"
type="solid"
class="text-passion-orange-pure bg-passion-orange-pure"
/>
<IconBackground
v-else-if="icon === 'warning'"
name="exclamation"
type="outline"
class="text-yellow-pure bg-yellow-pure"
/>
<IconBackground v-else-if="icon === 'success'" name="check" type="outline" class="text-green-pure bg-green-pure" />
<IconBackground
v-else-if="icon === 'info'"
name="information-circle"
type="outline"
class="text-ocean-blue-pure bg-ocean-blue-light"
/>
<IconBackground
v-else-if="icon === 'logged-out'"
name="logout"
type="outline"
class="text-orange-pure bg-orange-pure"
/>
<IconBackground
v-else-if="icon === 'logged-in'"
name="login"
type="outline"
:no-opacity="true"
class="text-ocean-blue-pure bg-ocean-blue-light"
/>
<div v-else-if="icon === 'pending-transaction'" class="relative text-ocean-blue-pure dark:text-white">
<SVGPending class="w-12 h-12" />
<Spinner class="absolute w-5 h-5 opacity-50 bottom-2 right-2" />
</div>
<Spinner v-else-if="icon === 'spinner'" class="w-12 h-12" />
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import SVGPending from '@/assets/icons/pending.svg?inline'
export default defineComponent({
components: {
SVGPending,
},
props: {
icon: { type: String, required: true },
},
setup() {
},
})
</script>

35
components/Info.vue Normal file
View File

@ -0,0 +1,35 @@
<template>
<div
v-tooltip="{
content: text,
classes: 'max-w-xs',
trigger: 'hover click',
}"
class="flex items-center justify-center w-4 h-4 leading-none transition-colors duration-150 cursor-pointer text-9 hover:text-ocean-blue-pure dark:hover:text-light text-grey-pure"
>
<SVGPrice v-if="icon === 'price'" />
<SVGInfo v-else />
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import SVGInfo from '@/assets/icons/info.svg?inline'
import SVGPrice from '@/assets/icons/price.svg?inline'
export default defineComponent({
props: {
text: {
type: String,
default: 'No "text" prop passed',
},
icon: {
type: String,
default: 'info',
},
},
components: { SVGInfo, SVGPrice },
})
</script>
<style></style>

View File

@ -0,0 +1,70 @@
<template>
<Card class="flex w-full pl-4 overflow-hidden border border-opacity-75 shadow-lg dark:bg-dark-300 border-grey-light">
<div class="flex items-center w-full py-4">
<IconNotification :icon="icon" />
<!-- Notification with link -->
<template v-if="href">
<div class="flex flex-col w-full px-4">
<div class="font-medium text-12" :class="{ 'mb-2': !!body }">{{ title }}</div>
<a
:href="href"
target="_blank"
rel="noopener noreferrer"
class="inline-flex items-center text-ocean-blue-pure dark:text-light dark:hover:text-white text-12"
>
<div class="">{{ body }} <Icon name="external-link" class="inline-block w-4 h-4" /></div>
</a>
</div>
</template>
<!-- Notification without link -->
<template v-else>
<div class="flex flex-col w-full px-4">
<div class="font-medium text-12" :class="{ 'mb-2': !!body }">{{ title }}</div>
<div class="font-medium text-ocean-blue-pure dark:text-grey-pure text-12">{{ body }}</div>
</div>
</template>
</div>
<div class="flex w-12">
<button
class="h-full px-3 py-3 focus:outline-none text-grey-pure hover:text-brand dark:hover:text-light"
@click="dismiss"
>
<Icon name="x" class="w-full" />
</button>
</div>
</Card>
</template>
<script>
import { defineComponent, onMounted } from '@nuxtjs/composition-api'
import SVGExternalLink from '@/assets/icons/external-link.svg?inline'
export default defineComponent({
components: {
SVGExternalLink,
},
props: {
title: { type: String, deafult: '' },
body: { type: String, deafult: '' },
href: { type: String, deafult: '' },
icon: { type: String, deafult: '' },
duration: { type: Number, deafult: 7000 },
},
setup(props, ctx) {
function dismiss() {
ctx.emit('dismiss')
}
onMounted(() => {
if (props.duration) {
setTimeout(dismiss, props.duration)
}
})
return { dismiss }
},
})
</script>

View File

@ -0,0 +1,83 @@
<template>
<div
v-if="queue.length"
class="fixed bottom-0 right-0 w-full px-2 pt-8 overflow-hidden sm:max-w-sm max-h-80"
style="z-index: 99999999999"
>
<transition-group
appear
enter-active-class="slideInUp"
leave-active-class="fadeOutRight"
tag="div"
class="flex flex-col w-full px-2 pb-4 space-y-4 overflow-y-auto max-h-72 scrollbar-hover"
>
<Notification
v-for="item in queue"
:key="item.key"
:title="item.title"
:body="item.body"
:href="item.href"
:icon="item.icon"
:duration="item.duration"
class="mr-2"
@dismiss="close(item.key)"
/>
</transition-group>
<button
v-if="queue.length > 1"
color="white"
class="absolute flex items-center px-2 py-1 font-medium leading-none bg-white border border-opacity-75 shadow-sm dark:text-light dark:bg-dark-300 border-grey-light right-5 rounded-xs text-ocean-blue-pure focus:outline-none"
style="top: 0px; font-size: 13px"
@click="closeAll"
>
<Icon name="x" class="w-4 h-4 mr-1" />Clear all
</button>
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import { useNotification } from '~/composables/useNotification'
export default defineComponent({
setup() {
const { queue, close, closeAll } = useNotification()
return { queue, close, closeAll }
},
})
</script>
<style>
@keyframes slideInUp {
from {
transform: translate3d(0, 100%, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}
.slideInUp {
animation-name: slideInUp;
animation-duration: 150ms;
}
@keyframes fadeOutRight {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
}
.fadeOutRight {
animation-name: fadeOutRight;
animation-duration: 150ms;
}
</style>

View File

@ -0,0 +1,51 @@
<template>
<div
v-tooltip="`Managing on ${protocolName} gives you rewards in ${tokenName}. The APY represents how much of the rewards you would earn during one year.`"
class="flex items-center px-1 py-1 border border-opacity-50 rounded-sm select-none border-grey-light"
>
<IconCurrency :currency="currency" no-height class="w-3 h-3 mr-1" />
<div class="text-11">{{ computedRate }}</div>
</div>
</template>
<script>
import { computed, defineComponent } from '@nuxtjs/composition-api'
import { useBigNumber } from '~/composables/useBigNumber'
import { useFormatting } from '~/composables/useFormatting'
export default defineComponent({
props: {
currency: {
type: String,
default: '0',
},
rate: {
type: String,
default: '0',
},
protocolName: {
type: String,
default: '',
},
tokenName: {
type: String,
default: '',
},
},
setup(props) {
const { formatPercent } = useFormatting()
const { lt } = useBigNumber()
const computedRate = computed(() => {
if (lt(props.rate, '0.0001')) {
return '< 0.01%'
}
return formatPercent(props.rate)
})
return { formatPercent, computedRate }
},
})
</script>
<style></style>

View File

@ -1,7 +1,7 @@
<template>
<div class="relative flex items-center w-full">
<input
class="w-full pr-4"
class="w-full pr-4 form-input"
type="text"
v-bind="$attrs"
:class="{ 'pl-9 py-1': dense, 'pl-12': !dense }"
@ -13,7 +13,7 @@
<script>
import { defineComponent, computed } from '@nuxtjs/composition-api'
import SVGSearch from '~/assets/icons/search.svg?inline'
import SVGSearch from '@/assets/icons/search.svg?inline'
export default defineComponent({
props: {
@ -37,3 +37,37 @@ export default defineComponent({
},
})
</script>
<style scoped>
.search-icon {
@apply text-grey-light;
@apply transition;
@apply duration-150;
}
.dark .search-icon {
@apply text-grey-pure;
}
input {
@apply transition;
@apply duration-150;
}
input:focus {
@apply outline-none;
@apply border-ocean-blue-pure;
}
.dark input:focus {
@apply outline-none;
@apply border-lightest;
}
input:focus ~ .search-icon {
@apply text-ocean-blue-pure;
}
.dark input:focus ~ .search-icon {
@apply text-lightest;
}
</style>

View File

@ -0,0 +1,75 @@
<template>
<div
class="absolute inset-y-0 right-0 z-10 flex flex-col w-full overflow-hidden transform shadow-xs xxl:translate-x-0 dark:shadow-none xxl-transform-none xxl:relative dark:bg-dark-500 bg-background"
style="max-width: clamp(var(--min-width-app), var(--width-sidebar-context), 100%)"
:class="{
'translate-x-0 duration-300': isOpen,
'translate-x-full duration-200': !isOpen
}"
>
<client-only>
<transition name="slideInRight" :duration="duration">
<keep-alive include="SidebarStrategyOverview">
<div
:is="component"
v-bind="props"
style="width: clamp(var(--min-width-app), var(--width-sidebar-context), 100%)"
></div>
</keep-alive>
</transition>
</client-only>
</div>
</template>
<script>
import { computed, defineComponent, onErrorCaptured } from '@nuxtjs/composition-api'
import { useSidebar } from '@/composables/useSidebar'
export default defineComponent({
setup() {
const { close, isOpen, component, props } = useSidebar()
const duration = computed(() => ({ enter: 300, leave: 300 }))
onErrorCaptured(() => close())
return { component, isOpen, props, duration }
},
errorCaptured() {
return false
},
})
</script>
<style scoped>
.slideInRight-enter-active {
position: absolute;
z-index: 1;
}
.slideInRight-leave-active {
z-index: 0;
}
.slideInRight-enter-active,
.slideInRight-leave-active {
transition: transform 0.3s ease-out;
}
.slideInRight-enter,
.slideInRight-leave-to {
transform: translateX(100%);
}
.slideInLeft-enter-active {
position: absolute;
z-index: 1;
}
.slideInLeft-leave-active {
z-index: 0;
}
.slideInLeft-enter-active,
.slideInLeft-leave-active {
transition: transform 0.3s ease-out;
}
.slideInLeft-enter,
.slideInLeft-leave-to {
transform: translateX(-100%);
}
</style>

View File

@ -0,0 +1,5 @@
<template>
<div class="flex flex-col dark:bg-dark-500 bg-background">
<slot />
</div>
</template>

View File

@ -0,0 +1,43 @@
<template>
<div
class="flex flex-shrink-0 w-full border-b items border-grey-light dark:border-dark-600 h-navbar"
style="min-height: var(--height-navbar)"
>
<div class="flex items-center w-full mx-auto" style="max-width: 296px">
<button
class="flex items-center justify-center py-2 mt-1 mr-5 text-opacity-50 group hover:text-opacity-100 focus:hover:text-opacity-100 text-grey-pure focus:outline-none dark:text-light dark:text-opacity-84"
@click="back"
>
<SVGArrowLeft
class="transition-transform duration-75 ease-out transform group-hover:-translate-x-1"
/>
</button>
<div class="w-full mt-1 font-semibold text-14"><slot /></div>
</div>
<!-- <button
v-if="!!close"
class="flex items-center justify-center p-2 mt-1 text-opacity-50 group hover:text-opacity-100 focus:hover:text-opacity-100 text-grey-pure focus:outline-none"
@click="close"
>
<SVGClose />
</button> -->
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import SVGClose from '@/assets/icons/close.svg?inline'
import SVGArrowLeft from '@/assets/icons/arrow-left.svg?inline'
import { useSidebar } from '~/composables/useSidebar'
export default defineComponent({
components: {
SVGClose,
SVGArrowLeft,
},
setup() {
const { back } = useSidebar()
return { back }
},
})
</script>

View File

@ -0,0 +1,19 @@
<template>
<SidebarContextContainer class="flex-1 h-full overflow-hidden">
<SidebarContextHeader><slot name="title" /></SidebarContextHeader>
<div class="overflow-y-scroll scrollbar-hover">
<div class="mx-auto" style="max-width: 296px">
<div class="py-2 sm:py-4">
<slot />
</div>
</div>
</div>
</SidebarContextContainer>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({})
</script>

View File

@ -0,0 +1,84 @@
<template>
<SidebarContextRootContainer>
<template #title>Supply SYMBOL</template>
<SidebarSectionValueWithIcon class="mt-6" label="Token Balance">
<template #icon><IconCurrency :currency="rootTokenKey"/></template>
<template #value>BALANCE</template>
</SidebarSectionValueWithIcon>
<hr />
<InputNumeric
v-model="amount"
:disabled="pending"
class="mt-6"
placeholder="Amount to supply"
:error="'ERROR'"
/>
<hr />
<div class="flex items-center justify-between mt-6">
<div class="font-semibold">Set Max</div>
<ToggleButton :checked="isMaxAmount" @change="toggle" />
</div>
<SidebarContextHeading class="mt-6"
>Projected Debt Position
</SidebarContextHeading>
<hr />
<SidebarSectionStatus
class="mt-6"
:liquidation="maxLiquidation"
:status="status"
/>
<hr />
<!-- prettier-ignore -->
<SidebarSectionValueWithIcon class="mt-6" label="Liquidation Price (ETH)">
<template #value>{{ formatUsdMax(liquidationPrice, liquidationMaxPrice) }} / {{ formatUsd(liquidationMaxPrice) }}</template>
</SidebarSectionValueWithIcon>
<hr />
<div class="flex flex-shrink-0 mt-6">
<ButtonCTA
class="w-full"
:disabled="!isValid || pending"
:loading="pending"
@click="cast"
>Supply</ButtonCTA
>
</div>
<ValidationErrors :error-messages="errorMessages" class="mt-6" />
</SidebarContextRootContainer>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import { useAaveV2Position } from '~/composables/useAaveV2Position'
import { useFormatting } from '~/composables/useFormatting'
export default defineComponent({
props: {
tokenKey: { type: String, required: true },
},
setup(props) {
const { status } = useAaveV2Position()
const { formatUsd, formatUsdMax, formatNumber, formatDecimal } = useFormatting()
return {
status,
formatUsd, formatUsdMax, formatNumber, formatDecimal,
}
},
})
</script>

View File

@ -0,0 +1,43 @@
<template>
<div v-if="filteredAssets.length" class="pb-6">
<CardCurrency
v-for="token in filteredAssets"
:key="token.address"
class="mt-2 sm:mt-4 first:mt-0"
:token-key="token.key"
:balance="token.balance"
:net-worth="token.netWorth"
:symbol="token.symbol"
:action-label="actionLabel"
@action="$emit('action', token.key)"
/>
</div>
<div v-else>
<NoSearchResults :search="search" />
<slot name="no-items" />
</div>
</template>
<script>
import { computed, defineComponent, watchEffect } from '@nuxtjs/composition-api'
import { useSearchFilter } from '~/composables/useSearchFilter'
import { useToken } from '~/composables/useToken'
export default defineComponent({
props: {
search: { type: String, default: null },
type: { type: String },
actionLabel: { type: String, required: true },
},
setup(props) {
const { assets } = useToken()
const typedAssets = computed(() => assets.value(props.type))
const { filtered: filteredAssets, search } = useSearchFilter(typedAssets, 'name', 'symbol')
watchEffect(() => (search.value = props.search))
return { filteredAssets }
},
})
</script>

View File

@ -0,0 +1,100 @@
<template>
<Card
border-radius="rounded-xs"
class="flex flex-col flex-grow pb-0 pl-4 pr-6 duration-200 transform cursor-pointer custom-block-card dark:bg-opacity-10"
style="border-left: 6px solid #ff007a"
>
<div class="flex flex-col">
<div class="grid grid-cols-4 gap-4 py-6">
<div class="flex flex-col">
<div class="text-16">{{ blockName }}</div>
<Tag
:logo="logo"
:title="title"
class="mt-2 border border-opacity-25 shadow-none rounded-xs border-grey-light w-max-content bg-grey-light bg-opacity-17"
/>
</div>
<div class="flex flex-col justify-center">
<div class="text-14 text-grey-pure">Input</div>
<div class="mt-2 font-medium text-14">{{ inputAmount }} {{ inputSymbol }}</div>
</div>
<div class="flex flex-col justify-center">
<div class="text-14 text-grey-pure">Output</div>
<div class="mt-2 font-medium text-14">{{ outputAmount }} {{ outputSymbol }}</div>
</div>
<div class="items-center justify-end hidden custom-block-card--actions">
<Button class="w-10 h-10 mr-4 rounded-full" color="ocean-blue" @click="$emit('edit', id)">
<Icon name="pencil" class="h-5" />
</Button>
<Button class="w-10 h-10 rounded-full" color="red" @click="$emit('delete', id)">
<Icon name="trash" class="h-5" />
</Button>
</div>
</div>
<div
v-if="slippageAmount"
class="flex items-center h-12 font-medium border-t text-14 text-grey-pure border-grey-light dark:border-opacity-10"
>
Price Impact {{ slippageAmount }}%
</div>
</div>
</Card>
</template>
<script>
import { computed, defineComponent } from '@nuxtjs/composition-api'
import { useProtocolData } from '~/composables/useProtocolData'
import { useToken } from '~/composables/useToken'
export default defineComponent({
props: {
id: {
type: Number,
default: '',
},
blockName: {
type: String,
default: '',
},
slippageAmount: {
type: String,
default: '',
},
inputAmount: {
type: String,
default: '',
},
inputToken: {
type: String,
default: '',
},
outputAmount: {
type: String,
default: '',
},
outputToken: {
type: String,
default: '',
},
protocol: {
type: Object,
default: () => {},
},
},
setup(props) {
const { logo, title } = useProtocolData(props.protocol.name)
const { getTokenByKey } = useToken()
const inputSymbol = computed(() => getTokenByKey(props.inputToken)?.symbol)
const outputSymbol = computed(() => getTokenByKey(props.outputToken)?.symbol)
return { logo, title, inputSymbol, outputSymbol }
},
})
</script>
<style scoped>
.custom-block-card:hover .custom-block-card--actions {
display: flex;
}
</style>

View File

@ -0,0 +1,41 @@
<template>
<div class="py-6 space-y-6">
<div v-for="(protocol, i) in items" :key="i">
<div class="text-16">{{ protocol.name }}</div>
<div class="mt-4 space-y-4">
<Card
v-for="(block, j) in protocol.blocks"
:key="j"
class="flex items-center p-4 select-none dark:bg-opacity-10"
>
<div class="flex flex-col pr-4">
<div class="font-medium text-14 text-navi-pure dark:text-light">
{{ block.name }}
</div>
</div>
<Button class="ml-auto w-18" color="ocean-blue" @click="startNewBlockSetup(protocol, block)">Add</Button>
</Card>
</div>
</div>
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import { useCustomBlocks } from '~/composables/useCustomBlocks'
export default defineComponent({
props: {
items: {
type: Array,
default: () => [],
},
},
setup() {
const { startNewBlockSetup } = useCustomBlocks()
return { startNewBlockSetup }
},
})
</script>
<style></style>

View File

@ -0,0 +1,7 @@
<template>
<div
class="flex items-center justify-center flex-1 h-40 border-2 border-dashed rounded-xs bg-grey-pure bg-opacity-10 border-grey-light dark:border-opacity-10"
>
<div class="font-medium text-grey-pure text-21">New block will be added here</div>
</div>
</template>

View File

@ -0,0 +1,71 @@
<template>
<div>
<div class="flex items-center">
<ValueDisplayLabel class="leading-none">APR type</ValueDisplayLabel>
<Info class="ml-2" :text="tooltipARP" />
</div>
<div v-if="stableBorrowEnabled" class="flex mt-2">
<ButtonBullet
v-for="item in items"
:key="item.value"
:value="value"
:label="computeLabel(item)"
class="flex-1"
:checked="isActive(item.value)"
@change="$emit('input', item)"
/>
</div>
<div v-else class="flex mt-2 font-medium">Variable rate only support</div>
</div>
</template>
<script>
import { defineComponent, onMounted } from '@nuxtjs/composition-api'
import { useFormatting } from '~/composables/useFormatting'
export default defineComponent({
props: {
value: { type: Object, default: () => {} },
items: { type: Array, default: () => [] },
stableBorrowEnabled: { type: Boolean, default: false },
borrowStableRate: { type: String, default: '' },
},
setup(props, ctx) {
const { formatPercent } = useFormatting()
function isActive(itemValue) {
return itemValue === props.value?.value
}
function setupDefaultValue() {
if (Array.isArray(props.items) && props.items.length > 0) {
ctx.emit('input', props.items[0])
}
}
function computeLabel(item) {
if (item.value === 'stable') {
return `${item.label} (${formatPercent(props.borrowStableRate)})`
}
return item.label
}
onMounted(() => {
if (!props.value) {
setupDefaultValue()
}
})
const tooltipARP = `<b>Annual Percentage Rate</b><br/>
Stable rates act can be re-balanced in response to changes in market conditions.<br/>
The variable rate is the rate based on the offer and demand in Aave.<br/>
<b>- Not all tokens support stable rate</b><br/>
<b>- Supplied token can't be borrowed with stable rate</b>
`
return { isActive, computeLabel, tooltipARP }
},
})
</script>
<style></style>

View File

@ -0,0 +1,38 @@
<template>
<div class="flex flex-col flex-shrink-0">
<div class="flex items-center justify-between mb-4">
<div class="text-grey-pure text-14">Status (max. {{ formatPercent(liquidation) }})</div>
<Badge class="w-18" :color="color">{{ text }}</Badge>
</div>
<div class="flex items-center">
<div class="w-24 mr-3 font-medium text-19">{{ formatPercent(status) }}</div>
<ProgressBar class="w-full" :color="color" :progress="status" />
</div>
</div>
</template>
<script>
import { computed, defineComponent } from '@nuxtjs/composition-api'
import { useBigNumber } from '~/composables/useBigNumber'
import { useFormatting } from '~/composables/useFormatting'
import { useStatus } from '~/composables/useStatus'
export default defineComponent({
props: {
liquidation: { type: String, required: true },
status: { type: String, required: true },
},
setup(props) {
const { formatPercent } = useFormatting()
const { div } = useBigNumber()
const statusLiquidationRatio = computed(() => div(props.status, props.liquidation).toFixed())
const { color, text } = useStatus(statusLiquidationRatio)
return { formatPercent, color, text }
},
})
</script>

View File

@ -0,0 +1,19 @@
<template>
<div class="flex items-center justify-between flex-shrink-0">
<ValueDisplay class="mr-3" :label="label">
<slot name="value" />
</ValueDisplay>
<slot name="icon" />
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({
props: {
label: { type: String, required: true },
},
})
</script>

View File

@ -0,0 +1,74 @@
<template>
<div class="py-6 space-y-4">
<Card
v-for="token in items"
:key="token.key"
class="flex items-center px-4 py-4 cursor-pointer first:mt-0 group hover:bg-selection dark:hover:bg-dark-300"
:class="{
'bg-selection dark:bg-dark-300': isActiveToken(token.key),
'bg-white dark:bg-dark-400': !isActiveToken(token.key),
}"
@click="select(token.key)"
>
<IconCurrency :currency="token.key" />
<div class="flex flex-col px-4">
<div
class="mb-1 font-semibold text-12"
:class="{
'text-navi-pure-light dark:text-light': !isActiveToken(token.key),
'text-ocean-blue-pure': isActiveToken(token.key),
}"
>
{{ token.name }}
</div>
<div class="font-medium whitespace-no-wrap text-12 text-grey-pure">{{ token.symbol }}</div>
</div>
<div class="flex flex-col ml-auto text-right">
<div
class="mb-1 font-semibold whitespace-no-wrap text-12"
:class="{
'text-navi-pure-light dark:text-light': !isActiveToken(token.key),
'text-ocean-blue-pure': isActiveToken(token.key),
}"
>
{{ formatDecimal(token.balance) }}
</div>
<div class="whitespace-no-wrap font-regular text-12 text-grey-pure">{{ formatUsd(token.netWorth) }}</div>
</div>
</Card>
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
import { useFormatting } from '~/composables/useFormatting'
export default defineComponent({
props: {
items: {
type: Array,
default: () => [],
},
activeToken: {
type: String,
default: null,
},
},
setup(props, context) {
function isActiveToken(tokenKey) {
return props.activeToken === tokenKey
}
function select(tokenKey) {
context.emit('currency-selected', tokenKey)
}
const { formatDecimal, formatUsd } = useFormatting()
return { isActiveToken, select, formatDecimal, formatUsd }
},
})
</script>
<style></style>

View File

@ -0,0 +1,54 @@
<template>
<Card border-radius="rounded-xs" class="flex flex-col dark:bg-opacity-10">
<div class="flex items-center p-4 border-b text-14 border-grey-pure border-opacity-10">
<div class="mr-2">{{ title }}</div>
<div><Info :text="info" /></div>
</div>
<div class="flex items-center p-4">
<IconCurrency class="w-12 h-12 mr-4" :currency="tokenKey" no-height />
<div class="flex flex-col">
<div class="text-16">{{ totalPrice | formatUsd }}</div>
<div class="mt-2 text-14 text-grey-pure">{{ tokenAmount }} {{ symbol }}</div>
</div>
</div>
</Card>
</template>
<script>
import { computed, defineComponent, ref } from '@nuxtjs/composition-api'
import { useBigNumber } from '~/composables/useBigNumber'
import { useToken } from '~/composables/useToken'
export default defineComponent({
props: {
title: {
type: String,
default: '',
},
info: {
type: String,
default: '',
},
tokenKey: {
type: String,
default: '',
},
tokenAmount: {
type: String,
default: '0',
},
},
setup(props) {
const { times } = useBigNumber()
const tokenKeyRef = ref(props.tokenKey)
const { symbol, price } = useToken(null, tokenKeyRef)
const totalPrice = computed(() => times(price.value, props.tokenAmount).toFixed())
return { symbol, totalPrice }
},
})
</script>
<style></style>

View File

@ -0,0 +1,38 @@
<template>
<div class="flex flex-col items-start">
<ValueDisplayLabel class="flex mb-2"
>{{ label }} <Info v-if="tooltip" :text="tooltip" class="ml-1" />
</ValueDisplayLabel>
<div class="h-6 font-medium text-19">
<Spinner v-if="loading" class="w-5 h-5" />
<slot v-else name="default" />
</div>
<transition
enter-active-class="duration-200 ease-out"
enter-class="opacity-0"
enter-to-class="opacity-100"
leave-active-class="duration-200 ease-in"
leave-class="opacity-100"
leave-to-class="opacity-0"
>
<div v-if="!!$slots.badge">
<Badge color="blue" class="mt-1">
<slot name="badge" />
</Badge>
</div>
</transition>
</div>
</template>
<script>
import { defineComponent } from '@nuxtjs/composition-api'
export default defineComponent({
props: {
label: { type: String, default: null },
loading: { type: Boolean, default: false },
tooltip: { type: String, default: null },
},
})
</script>

View File

@ -0,0 +1,5 @@
<template>
<div class="text-14 text-grey-pure">
<slot />
</div>
</template>

View File

@ -0,0 +1,107 @@
import { ref, computed, useContext } from "@nuxtjs/composition-api";
import { useSidebarBlockData } from "~/composables/useSidebarBlockData";
export function useCustomBlocks() {
const { app, store } = useContext();
const { getBlockData } = useSidebarBlockData();
const search = ref("");
const filteredBlocks = computed(() => {
if (!search.value) return protocolsList.value;
const arrCopy = JSON.parse(JSON.stringify(protocolsList.value));
const result = [];
const term = search.value.toLowerCase();
const re = new RegExp(term, "i");
arrCopy.forEach(protocol => {
const filteredBlocks = protocol.blocks.filter(block =>
re.test(block.name)
);
if (filteredBlocks.length) {
protocol.blocks = filteredBlocks;
result.push(protocol);
}
});
return result;
});
function startNewBlockSetup(protocol, block) {
createNewBlock(protocol, block);
openBlockSetupSidebar(block.type);
}
function startBlockEdit(block) {
store.dispatch("custom-strategy/setSelectedBlock", {
type: block.type,
blockData: block
});
openBlockSetupSidebar(block.type);
}
function createNewBlock(protocol, block) {
const blockData = { protocol, id: -1 };
store.dispatch("custom-strategy/setSelectedBlock", {
type: block.type,
blockData
});
}
function openBlockSetupSidebar(type) {
const blockData = getBlockData(type);
if (blockData && blockData.hash) {
app.router.push({
hash: blockData.hash
});
}
}
const protocolsList = ref([
{
name: "Uniswap",
tokenKey: "uni",
blocks: [
{ name: "Swap Token", type: "swap-token" },
{ name: "Add Liqudity" },
{ name: "Remove Liquidity" }
]
},
{
name: "Aave",
tokenKey: "aave",
blocks: [
{ name: "Flash Loan", type: "flashloan" },
{ name: "Deposit" },
{ name: "Withdraw" }
]
},
{
name: "Makerdao",
tokenKey: "mkr",
blocks: [
{ name: "Swap Token", type: "swap-token" },
{ name: "Add Liqudity" },
{ name: "Remove Liquidity" }
]
},
{
name: "Compound",
tokenKey: "comp",
blocks: [
{ name: "Flash Loan", type: "flashloan" },
{ name: "Deposit" },
{ name: "Withdraw" }
]
}
]);
return {
search,
filteredBlocks,
startNewBlockSetup,
openBlockSetupSidebar,
startBlockEdit
};
}

21
composables/useLink.ts Normal file
View File

@ -0,0 +1,21 @@
import { computed } from '@nuxtjs/composition-api'
import { useWeb3 } from './useWeb3'
export function useLink() {
const { networkName } = useWeb3()
const addressDetailsLink = computed(() => {
if (networkName.value === 'polygon') {
return 'https://polygonscan.com/address'
}
return 'https://etherscan.io/address'
})
return { addressDetailsLink }
}
export const getEtherscanLink = (transactionHash) => `https://etherscan.io/tx/${transactionHash}`
export const getMaticLink = (transactionHash) => `https://polygonscan.com/tx/${transactionHash}`
export const getTenderlyLink = (simulationId) =>
`https://dashboard.tenderly.co/public/InstaDApp/dsa-simulations/fork-simulation/${simulationId}?hideSidebar=true`

View File

@ -0,0 +1,170 @@
import { ref } from "@nuxtjs/composition-api";
import { useFormatting } from "@/composables/useFormatting";
import { getEtherscanLink, getMaticLink, getTenderlyLink } from "./useLink";
import { useRandom } from "./useRandom";
const { makeid } = useRandom();
const queue = ref([]);
export function useNotification() {
const { shortenHash } = useFormatting();
function close(key) {
queue.value = queue.value.filter(item => item.key !== key);
}
function closeAll() {
queue.value.forEach((item, index) => {
setTimeout(() => {
queue.value.shift();
}, index * 150);
});
}
function closeAwaiting(title, success = true, key) {
const found = queue.value.find(item => item.key === key);
if (!found) return;
if (success) {
found.icon = "success";
found.title = title;
} else {
found.icon = "error";
found.title = title;
}
setTimeout(() => {
close(key);
}, 2000);
}
/**
* Ques a notification to show to the user.
*
* @param {string} params.icon Icon of notification
* @param {string} params.title Title of notification
* @param {string} params.body Body text of notification
* @param {string} params.href Link of notification body
* @param {number} params.duration Duration in ms. 0 for no timeout
* @param {string} params.key key for notification identification
*/
function show(params) {
if (params) {
if (!params.key) params.key = makeid(10);
queue.value.push(params);
}
}
function showError(title, body, href) {
show({ icon: "error", title, body, href, duration: 0 });
}
function showWarning(title, body) {
show({ icon: "warning", title, body, duration: 0 });
}
function showNotImplemented() {
show({
icon: "warning",
title: "Not implemented",
body: "This feature is not yet implemented."
});
}
function showSuccess(title, body) {
show({ icon: "success", title, body, duration: 5000 });
}
function showInfo(title, body) {
show({ icon: "info", title, body, duration: 7000 });
}
function showAwaiting(title, body) {
const key = makeid(10);
show({ icon: "spinner", title, body, duration: 0, key });
return key;
}
function showPendingTransaction(transactionHash, network) {
let href;
if (network === "matic") {
href = getMaticLink(transactionHash);
} else {
href = getEtherscanLink(transactionHash);
}
const body = shortenHash(transactionHash);
show({
icon: "pending-transaction",
title: "Pending transaction",
href,
body,
duration: 0,
key: transactionHash
});
}
function showConfirmedTransaction(transactionHash, network) {
let href;
if (network === "matic") {
href = getMaticLink(transactionHash);
} else {
href = getEtherscanLink(transactionHash);
}
const body = shortenHash(transactionHash);
const found = queue.value.find(item => item.key === transactionHash);
if (found) {
found.icon = "success";
found.title = "Transaction Confirmed";
found.href = href;
found.body = body;
} else {
show({
icon: "success",
title: "Transaction Confirmed",
href,
body,
duration: 0
});
}
}
function showConfirmedSimulation(transactionId) {
const href = getTenderlyLink(transactionId);
const body = shortenHash(transactionId);
show({
icon: "success",
title: "Successfully Simulated",
href,
body,
duration: 5000
});
}
function showLoggedIn(title, body) {
show({ icon: "logged-in", title, body, duration: 2000 });
}
function showLoggedOut(title, body) {
show({ icon: "logged-out", title, body, duration: 2000 });
}
return {
queue,
close,
closeAwaiting,
showError,
showWarning,
showNotImplemented,
showSuccess,
showInfo,
showPendingTransaction,
showConfirmedTransaction,
showConfirmedSimulation,
showLoggedIn,
showLoggedOut,
showAwaiting,
closeAll
};
}

View File

@ -0,0 +1,83 @@
// @ts-nocheck
import SVGCompound from "@/assets/logo/compound.svg?inline";
import SVGMakerDAO from "@/assets/logo/makerdao.svg?inline";
import SVGAave from "@/assets/logo/aave.svg?inline";
import SVGAaveV2 from "@/assets/logo/aave-v2.svg?inline";
import SVGUniswap from "@/assets/logo/uniswap.svg?inline";
import SVGInstadapp from "@/assets/logo/instadapp-logo-icon.svg?inline";
import SVGDefault from "@/assets/logo/default.svg?inline";
import { computed } from "@nuxtjs/composition-api";
const protocols = {
makerdao: {
title: "MakerDAO",
logo: SVGMakerDAO,
protocol: "makerdao",
supportedNetworks: ["mainnet"]
},
compound: {
title: "Compound",
logo: SVGCompound,
protocol: "compound",
supportedNetworks: ["mainnet"]
},
aave: {
title: "Aave",
logo: SVGAave,
protocol: "aave",
supportedNetworks: ["mainnet"]
},
"aave-v2": {
title: "Aave V2",
logo: SVGAaveV2,
protocol: "aave-v2",
supportedNetworks: ["mainnet", "matic"]
},
uniswap: {
title: "Uniswap",
logo: SVGUniswap,
protocol: "uniswap",
supportedNetworks: ["mainnet"]
},
instadapp: {
title: "Instadapp",
logo: SVGInstadapp,
protocol: "guniswap",
supportedNetworks: ["mainnet"]
},
default: {
title: "Balance",
logo: SVGDefault,
protocol: "default",
supportedNetworks: ["mainnet"]
}
};
export function useProtocolData(protocol) {
protocol = String(protocol).toLowerCase();
const data = computed(() => protocols[protocol]);
const title = computed(() => (data.value ? data.value.title : null));
const logo = computed(() => (data.value ? data.value.logo : null));
const protocolName = computed(() =>
data.value ? data.value.protocol : null
);
const leverageableProtocols = computed(() =>
//@ts-ignore
Object.values(protocols).filter(protocol => protocol.supportLeverageEth)
);
function networkIsSupported(network) {
return data.value.supportedNetworks.includes(network);
}
return {
title,
logo,
protocolName,
leverageableProtocols,
networkIsSupported
};
}

20
composables/useRandom.ts Normal file
View File

@ -0,0 +1,20 @@
export function useRandom() {
function makeid(length) {
let result = "";
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
return { makeid, getRandomInt };
}

106
composables/useSidebar.ts Normal file
View File

@ -0,0 +1,106 @@
import {
computed,
nextTick,
ref,
useContext,
useRouter,
watch
} from "@nuxtjs/composition-api";
import SidebarAaveV2Supply from "~/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue";
import { useDSA } from "./useDSA";
import { useWeb3 } from "./useWeb3";
// import SidebarAaveV2Borrow from '~/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue'
// import SidebarAaveV2Payback from '~/components/sidebar/context/aaveV2/SidebarAaveV2Payback.vue'
// import SidebarAaveV2Withdraw from '~/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue'
const sidebars = {
"/polygon/aave-v2#overview": { component: null },
"/polygon/aave-v2#supply": { component: SidebarAaveV2Supply },
"/polygon/aave-v2#borrow": { component: null },
"/polygon/aave-v2#payback": { component: null },
"/polygon/aave-v2#withdraw": { component: null },
"/polygon/aave-v2#withdraw-token": {
component: null,
back: { hash: "withdraw-overview" }
}
};
const sidebar = ref(null);
const props = ref(null);
export function init() {
const { route } = useContext();
const router = useRouter()
const { active } = useWeb3();
const { dsa } = useDSA();
watch(
[route, active, dsa],
async ([route, active, dsa], [oldRoute, oldActive, oldDsa]) => {
await nextTick();
const hasPathChanged = !oldRoute || route.path !== oldRoute.path;
const hasIsLoggedInChanged = active !== oldActive;
const hasDsaChanged = dsa !== oldDsa;
const [hash, params] = route.hash.split("?");
if (hasPathChanged){
router.push({ hash: null })
return
}
sidebar.value = sidebars[route.path + hash] || sidebars[hash];
if (!sidebar.value) {
props.value = {};
return;
}
if (!params) {
props.value = {};
return;
}
// parse url params (example: `prop1=value1&prop2=value2`)
props.value = params.split("&").reduce((props, entry) => {
const [key, value] = entry.split("=");
props[key] = value;
return props;
}, {});
},
{ immediate: true }
);
}
export function useSidebar() {
const { route } = useContext();
const router = useRouter();
function close() {
router.push({ hash: null });
}
function back() {
const location = sidebar.value?.back || { hash: null };
router.push(location);
}
const component = computed(() => sidebar.value?.component);
const isOpen = computed(() => {
if (!route.value.hash) return false;
return !!component.value;
});
return {
close,
back,
component,
props,
isOpen
};
}

View File

@ -0,0 +1,33 @@
import { useNotification } from "@/composables/useNotification";
import SwapTokenBlock from "@/core/entity/swap-token-block";
const { showNotImplemented } = useNotification();
const blocks = {
"swap-token": {
hash: "setup-swap-token",
entity: SwapTokenBlock
}
};
export function useSidebarBlockData() {
function getBlockData(type) {
const block = blocks[type];
const hash = block ? block.hash : null;
return { hash };
}
function createBlockFactory({ type, blockData }) {
const block = blocks[type];
const BlockEntity = block ? block.entity : null;
if (BlockEntity) {
return new BlockEntity(blockData);
} else {
showNotImplemented();
}
}
return { getBlockData, createBlockFactory };
}

52
composables/useStatus.ts Normal file
View File

@ -0,0 +1,52 @@
import { computed } from '@nuxtjs/composition-api'
import { useBigNumber } from './useBigNumber'
const { lt, gte, lte, isZero } = useBigNumber()
const colorValues = [
{ minValue: 1.0, color: 'red-dark' },
{ minValue: 0.9, color: 'red' },
{ minValue: 0.85, color: 'passion-orange' },
{ minValue: 0.8, color: 'orange' },
{ minValue: 0.75, color: 'yellow' },
{ minValue: 0.0, color: 'green-pure' },
]
const textValues = [
{ minValue: 1, text: 'Liquidate' },
{ minValue: 0.9, text: 'Very Risky' },
{ minValue: 0.75, text: 'Risky' },
{ minValue: 0, text: 'Safe' },
]
export function useStatus(statusLiquidationRatioRef, statusRef, liquidationRef) {
const color = computed(() => {
if (!isZero(statusRef) && !isZero(liquidationRef)) {
if (gte(statusRef.value, '1')) return 'red-dark'
}
if (lte(statusLiquidationRatioRef.value, '0')) return 'grey'
const colorValue = colorValues.find((colorValue) => gte(statusLiquidationRatioRef.value, colorValue.minValue))
return colorValue.color
})
const text = computed(() => {
if (!isZero(statusRef) && !isZero(liquidationRef)) {
if (gte(statusRef.value, '1')) return 'Liquidate'
}
if (lte(statusLiquidationRatioRef.value, '0')) return 'No position'
const textValue = textValues.find((textValue) => gte(statusLiquidationRatioRef.value, textValue.minValue))
if (!textValue) return 'No position'
return textValue.text
})
return { color, text }
}
export function getSlippageBadgeColor(value) {
return lt(value, '0.02') ? 'green' : 'red'
}

12
core/entity/protocol.ts Normal file
View File

@ -0,0 +1,12 @@
//@ts-nocheck
export default class Protocol {
constructor(data) {
if (data) {
this.name = data.name;
this.tokenKey = data.tokenKey;
} else {
this.name = "";
this.tokenKey = "";
}
}
}

View File

@ -0,0 +1,25 @@
//@ts-nocheck
import Protocol from '@/core/entity/protocol'
export default class SwapTokenBlock {
constructor(data) {
if (data) {
this.name = 'Swap Token'
this.type = 'swap-token'
this.id = data.id
this.protocol = new Protocol(data.protocol)
this.inputAmount = Number(data.inputAmount) || 0
this.inputTokenKey = this._setInputTokenKey(data.inputTokenKey)
this.outputAmount = Number(data.outputAmount) || 0
this.outputTokenKey = data.outputTokenKey
this.slippage = Number(data.slippage) || 0
}
}
_setInputTokenKey(tokenKey) {
if (!tokenKey) {
return this.protocol.tokenKey
}
return tokenKey
}
}

View File

@ -1,11 +1,14 @@
<template>
<div class="min-h-screen font-sans antialiased text-primary-black">
<div class="min-h-screen overflow-hidden font-sans antialiased text-primary-black">
<Navbar />
<div class="max-w-6xl mx-auto py-12">
<div class="max-w-6xl mx-auto py-12 overflow-x-hidden ">
<div>
<Nuxt />
</div>
</div>
<SidebarContext class="grid-sidebar-context" />
<NotificationBar />
</div>
</template>
@ -15,7 +18,7 @@ import MakerDAOIcon from '~/assets/icons/makerdao.svg?inline'
import CompoundIcon from '~/assets/icons/compound.svg?inline'
import AaveIcon from '~/assets/icons/aave.svg?inline'
import { useWeb3 } from '~/composables/useWeb3'
import { init as initSidebars } from '~/composables/useSidebar'
export default defineComponent({
components: {
MakerDAOIcon,
@ -25,6 +28,8 @@ export default defineComponent({
setup() {
const { active, activate, deactivate } = useWeb3();
initSidebars();
return {
active,
activate,
@ -33,4 +38,27 @@ export default defineComponent({
}
})
</script>
</script>
<style>
:root {
--min-width-app: 320px;
--width-sidebar-context: 360px;
--width-container-main: 1016px;
--height-navbar: 64px;
--height-top-banner: 32px;
@screen sm {
--height-navbar: 82px;
}
}
.grid-sidebar-context {
grid-row-start: navbar;
grid-row-end: main;
@screen xl {
grid-area: sidebar-context;
}
}
</style>

View File

@ -32,6 +32,7 @@ export default {
plugins: [
"~/plugins/v-click-outside.js",
"~/plugins/web3modal.js",
{ src: '~/plugins/v-tooltip', mode: 'client' },
],
// Auto import components: https://go.nuxtjs.dev/config-components

View File

@ -16,9 +16,11 @@
"@walletconnect/web3-provider": "^1.4.1",
"bignumber.js": "^9.0.1",
"core-js": "^3.15.1",
"css-color-function": "^1.3.3",
"dsa-connect": "^0.4.2",
"nuxt": "^2.15.7",
"v-click-outside": "^3.1.2",
"v-tooltip": "^2.1.3",
"walletlink": "^2.1.6",
"web3": "^1.4.0",
"web3modal": "^1.9.3"

View File

@ -0,0 +1,12 @@
import Vue from 'vue'
import { VTooltip, VPopover, VClosePopover } from 'v-tooltip'
import './v-tooltip.css'
VTooltip.options.defaultOffset = 4
VTooltip.options.defaultDelay = 150
VTooltip.options.autoHide = false
VTooltip.options.defaultTrigger = 'hover focus click'
Vue.directive('tooltip', VTooltip)
Vue.directive('close-popover', VClosePopover)
Vue.component('VPopover', VPopover)

View File

@ -0,0 +1,73 @@
.tooltip {
@apply z-50 block;
@apply max-w-xs;
}
.tooltip .tooltip-inner {
@apply px-4 py-2 font-medium rounded bg-navi-pure text-light text-14;
}
.tooltip .tooltip-arrow {
z-index: 1;
@apply absolute w-0 h-0 m-1 border border-navi-pure;
}
.dark .tooltip .tooltip-inner {
@apply bg-dark-300 text-light;
}
.dark .tooltip .tooltip-arrow {
@apply border-dark-300;
}
.tooltip[x-placement^='top'] {
@apply mb-1;
}
.tooltip[x-placement^='top'] .tooltip-arrow {
border-width: 4px 4px 0 4px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
bottom: -4px;
left: calc(50% - 4px);
@apply my-0;
}
.tooltip[x-placement^='bottom'] {
@apply mt-1;
}
.tooltip[x-placement^='bottom'] .tooltip-arrow {
border-width: 0 4px 4px 4px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-top-color: transparent !important;
top: -4px;
left: calc(50% - 4px);
@apply my-0;
}
.tooltip[x-placement^='right'] {
@apply ml-1;
}
.tooltip[x-placement^='right'] .tooltip-arrow {
border-width: 4px 4px 4px 0;
border-left-color: transparent !important;
border-top-color: transparent !important;
border-bottom-color: transparent !important;
left: -4px;
top: calc(50% - 4px);
@apply mx-0;
}
.tooltip[x-placement^='left'] {
@apply mr-1;
}
.tooltip[x-placement^='left'] .tooltip-arrow {
border-width: 4px 0 4px 4px;
border-top-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
right: -4px;
top: calc(50% - 4px);
@apply mx-0;
}
.tooltip[aria-hidden='true'] {
transition: opacity 0.15s, visibility 0.15s;
@apply invisible opacity-0;
}
.tooltip[aria-hidden='false'] {
@apply visible opacity-100;
transition: opacity 0.15s;
}

View File

@ -1,12 +1,23 @@
const defaultTheme = require("tailwindcss/defaultTheme");
module.exports = {
mode: 'jit',
purge: [],
darkMode: false, // or 'media' or 'class'
dark: 'class',
theme: {
extend: {
fontSize: {
9: ['9px', '10px'],
11: ['11px', '14px'],
12: ['12px', '14px'],
14: ['14px', '17px'],
16: ['16px', '19.5px'],
18: ['18px', '21px'],
19: ['19px', '23px'],
21: ['21px', '25.6px'],
24: ['24px', '28.8px'],
32: ['32px', '39.01px'],
},
colors: {
primary: {
black: "#161E2E",
@ -15,7 +26,86 @@ module.exports = {
dark: "#3F75FF",
hover: "#5E8BFF",
}
}
},
lightest: '#FEFEFF',
light: '#FCFCFC',
background: 'rgb(245, 246, 250)',
'background-light': '#FBFCFD',
'background-dark': '#2C3D53',
selection: '#F8F9FE',
brand: '#11263F', // dark.600
dark: {
300: '#2c50a0',
400: '#244166',
500: '#152e4d',
600: '#12263f',
},
purple: {
pure: '#5242A2',
light: '#EEECF6',
},
turquese: {
pure: '#2EBDC2',
light: '#EAF8F9',
},
green: {
pure: '#32C34A',
light: '#EBF9ED',
},
red: {
pure: '#E63959',
...defaultTheme.colors.red,
},
blue: {
pure: '#3997C5',
light: '#E9F3F8',
},
'ocean-blue': {
pure: '#3F75FF',
light: '#ECF1FF',
},
yellow: {
pure: '#F3C024',
light: '#FEF8E7',
},
orange: {
pure: '#F08642',
light: '#FDF3EC',
},
'passion-orange': {
pure: '#FF6600',
light: '#FFF0E5',
},
'light-brown': {
pure: '#FFC888',
light: '#FFF9F3',
},
brown: {
pure: '#CA8700',
light: '#FAF3E5',
},
navi: {
pure: '#131E40',
'pure-light': '#2D3755',
lighter: '#12263F',
light: 'rgba(19, 30, 64, 0.1)',
},
grey: {
pure: '#A5ADC6',
light: '#e9ecf2',
dark: '#556D9C',
},
},
opacity: {
10: '0.10',
17: '0.17',
20: '0.20',
38: '0.38',
70: '0.7',
84: '0.84',
90: '0.90',
},
fontFamily: {
sans: ["Montserrat", ...defaultTheme.fontFamily.sans]

View File

@ -864,6 +864,13 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/runtime@^7.13.10":
version "7.14.8"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446"
integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.14.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d"
@ -2859,6 +2866,11 @@ backoff@^2.5.0:
dependencies:
precond "0.2"
balanced-match@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a"
integrity sha1-tQS9BYabOSWd0MXvw12EMXbczEo=
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@ -3594,6 +3606,11 @@ clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
clone@^2.0.0, clone@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
@ -3626,7 +3643,7 @@ collection-visit@^1.0.0:
map-visit "^1.0.0"
object-visit "^1.0.0"
color-convert@^1.9.0:
color-convert@^1.3.0, color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@ -3650,6 +3667,13 @@ color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=
dependencies:
color-name "^1.0.0"
color-string@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
@ -3658,6 +3682,15 @@ color-string@^1.6.0:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
color@^0.11.0:
version "0.11.4"
resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=
dependencies:
clone "^1.0.2"
color-convert "^1.3.0"
color-string "^0.3.0"
color@^3.0.0, color@^3.1.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/color/-/color-3.2.0.tgz#108509078b8b93746515cbdffb03e20097ec586b"
@ -3998,6 +4031,16 @@ css-blank-pseudo@^0.1.4:
dependencies:
postcss "^7.0.5"
css-color-function@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.3.tgz#8ed24c2c0205073339fafa004bc8c141fccb282e"
integrity sha1-jtJMLAIFBzM5+voAS8jBQfzLKC4=
dependencies:
balanced-match "0.1.0"
color "^0.11.0"
debug "^3.1.0"
rgb "~0.1.0"
css-color-keywords@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
@ -8416,6 +8459,11 @@ pocket-js-core@0.0.3:
dependencies:
axios "^0.18.0"
popper.js@^1.16.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
portfinder@^1.0.26:
version "1.0.28"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
@ -9836,6 +9884,11 @@ rgb-regex@^1.0.1:
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
rgb@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5"
integrity sha1-vieykej+/+rBvZlylyG/pA/AN7U=
rgba-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
@ -11323,6 +11376,16 @@ v-click-outside@^3.1.2:
resolved "https://registry.yarnpkg.com/v-click-outside/-/v-click-outside-3.1.2.tgz#1dbaa14bf09a21bd16f23a38f03bfa3988f71281"
integrity sha512-gMdRqfRE6m6XU6SiFi3dyBlFB2MWogiXpof8Aa3LQysrl9pzTndqp/iEaAphLoadaQUFnQ0ec6fLLaxr7LiY6A==
v-tooltip@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.3.tgz#281c2015d1e73787f13c8956aa295b8c3a73f261"
integrity sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==
dependencies:
"@babel/runtime" "^7.13.10"
lodash "^4.17.21"
popper.js "^1.16.1"
vue-resize "^1.0.1"
varint@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
@ -11390,6 +11453,13 @@ vue-no-ssr@^1.1.1:
resolved "https://registry.yarnpkg.com/vue-no-ssr/-/vue-no-ssr-1.1.1.tgz#875f3be6fb0ae41568a837f3ac1a80eaa137b998"
integrity sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g==
vue-resize@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.1.tgz#c120bed4e09938771d622614f57dbcf58a5147ee"
integrity sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==
dependencies:
"@babel/runtime" "^7.13.10"
vue-router@^3.5.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.2.tgz#5f55e3f251970e36c3e8d88a7cd2d67a350ade5c"