diff --git a/index.html b/index.html index 9fb654a..ed30ca6 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - - Vite + React + TS + + peppy.finance | perpetuals on shimmer
diff --git a/package.json b/package.json index 27f7ca4..0b03dc1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "interface", + "name": "peppy.finance.interface", "private": true, - "version": "0.0.0", + "version": "0.0.1", "packageManager": "pnpm@8.11.0", "type": "module", "scripts": { @@ -38,6 +38,7 @@ "react-dom": "^18.2.0", "react-router-dom": "^6.21.3", "react-ts-tradingview-widgets": "^1.2.3", + "react-use": "^17.5.0", "sonner": "^1.4.41", "tailwind-merge": "^2.1.0", "tailwindcss-animate": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a32e6cd..b49c0ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ dependencies: react-ts-tradingview-widgets: specifier: ^1.2.3 version: 1.2.4(react-dom@18.2.0)(react@18.2.0) + react-use: + specifier: ^17.5.0 + version: 17.5.0(react-dom@18.2.0)(react@18.2.0) sonner: specifier: ^1.4.41 version: 1.4.41(react-dom@18.2.0)(react@18.2.0) @@ -5259,6 +5262,10 @@ packages: '@types/istanbul-lib-report': 3.0.3 dev: false + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + /@types/js-yaml@4.0.9: resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} dev: true @@ -6101,9 +6108,6 @@ packages: resolution: {integrity: sha512-GBryCiyl+taz5DPq0expxzfMVcrpKjWvEBSAqT1tPUSthnzOWnVF77XlUAYgFZqzPsEu9lQ1dHCdqZx7WWMCXA==} peerDependencies: '@web3modal/wallet': 4.1.1 - peerDependenciesMeta: - '@web3modal/siwe': - optional: true dependencies: '@web3modal/common': 4.1.1 '@web3modal/core': 4.1.1(@types/react@18.2.66)(react@18.2.0) @@ -6144,15 +6148,6 @@ packages: '@wagmi/connectors': '>=4.0.0' '@wagmi/core': '>=2.0.0' viem: '>=2.0.0' - peerDependenciesMeta: - '@web3modal/siwe': - optional: true - react: - optional: true - react-dom: - optional: true - vue: - optional: true dependencies: '@wagmi/connectors': 4.1.19(@types/react@18.2.66)(@wagmi/core@2.6.10)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.2)(viem@2.9.3) '@wagmi/core': 2.6.10(@types/react@18.2.66)(react@18.2.0)(typescript@5.4.2)(viem@2.9.3) @@ -6227,6 +6222,10 @@ packages: tslib: 2.6.2 dev: true + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false + /abitype@0.9.8(typescript@5.4.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: @@ -7163,6 +7162,12 @@ packages: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: false + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + /core-js-compat@3.36.1: resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: @@ -7255,6 +7260,20 @@ packages: optional: true dev: false + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -8104,7 +8123,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -8124,6 +8142,10 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + /fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: @@ -8139,6 +8161,10 @@ packages: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false + /fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false + /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: @@ -8152,6 +8178,10 @@ packages: strnum: 1.0.5 dev: false + /fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -8714,6 +8744,10 @@ packages: engines: {node: '>=16.17.0'} dev: false + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + /i18next-browser-languagedetector@7.2.0: resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} dependencies: @@ -8794,6 +8828,13 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /inline-style-prefixer@7.0.0: + resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + dependencies: + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 + dev: false + /inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -9297,6 +9338,10 @@ packages: resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==} dev: true + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -9742,6 +9787,10 @@ packages: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} dev: false + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false @@ -10146,6 +10195,24 @@ packages: object-assign: 4.1.1 thenify-all: 1.6.0 + /nano-css@5.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + css-tree: 1.1.3 + csstype: 3.1.3 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 7.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rtl-css-js: 1.16.1 + stacktrace-js: 2.0.2 + stylis: 4.3.1 + dev: false + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -11144,6 +11211,40 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-use@17.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.6.2 + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -11307,6 +11408,10 @@ packages: /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -11405,6 +11510,12 @@ packages: fsevents: 2.3.3 dev: true + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.24.1 + dev: false + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -11468,6 +11579,11 @@ packages: loose-envify: 1.4.0 dev: false + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + /scuid@1.1.0: resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} dev: true @@ -11567,6 +11683,11 @@ packages: has-property-descriptors: 1.0.2 dev: true + /set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -11714,6 +11835,11 @@ packages: source-map: 0.6.1 dev: false + /source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -11748,6 +11874,12 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false + /stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -11759,6 +11891,21 @@ packages: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} dev: false + /stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + /stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} @@ -11912,6 +12059,10 @@ packages: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: false + /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -12059,6 +12210,11 @@ packages: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} dev: false + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: @@ -12096,6 +12252,10 @@ packages: dependencies: is-number: 7.0.0 + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -12113,6 +12273,10 @@ packages: typescript: 5.4.2 dev: true + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..c275382 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/peppy.old.png b/public/peppy.old.png new file mode 100644 index 0000000..7fee15d Binary files /dev/null and b/public/peppy.old.png differ diff --git a/src/App.css b/src/App.css index 6d39268..c30d1ec 100644 --- a/src/App.css +++ b/src/App.css @@ -14,13 +14,45 @@ body { line-height: normal; /* TODO: DESKTOP: remove max-width */ - max-width: 460px; + max-width: 460px !important; } #root { margin: 0; height: 100%; - /* TODO: DESKTOP: remove max-width */ max-width: 460px; } + +#topbar { + z-index: 1000; + max-width: 460px; +} +#content { + margin: 0px; + margin-top: 70px; + padding-top: 0px; + position: absolute; + top: 0; + max-width: 460px; +} +#cardFooter { + display:grid; +} + +@media screen and (min-width: 800px) { + #content { + margin: 0px; + padding-top:70px; + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); + } +} + +@media screen and (max-width: 800px) { + #exchangeChart { + display:none; + } +} \ No newline at end of file diff --git a/src/Layout.tsx b/src/Layout.tsx index 113f7ab..331bf43 100644 --- a/src/Layout.tsx +++ b/src/Layout.tsx @@ -1,93 +1,16 @@ -import { useState } from 'react'; -import './App.css'; -import { Link, Outlet, useLocation } from 'react-router-dom'; -import { HamburgerMenuIcon } from '@radix-ui/react-icons'; -import { SheetContent, SheetHeader, SheetTitle, Sheet } from './components/ui/sheet'; +import { Outlet } from 'react-router-dom'; import { Toaster } from './components/ui/sonner'; -import classNames from 'classnames'; - -const Header = () => { - const [menuOpen, setMenuOpen] = useState(false); - const location = useLocation(); - - return ( -
- - setMenuOpen(true)} /> - - - Menu - -
- setMenuOpen(false)} - > - Homepage - - setMenuOpen(false)} - > - Get Started 🚀 - - setMenuOpen(false)} - > - Exchange - - setMenuOpen(false)} - > - Open Positions - - setMenuOpen(false)} - > - Closed Positions - - setMenuOpen(false)} - > - Pool - -
-
-
- -
- ); -}; +import { Topbar } from './components/Navbar/topbar'; export const Layout = () => { return (
-
-
+ +
+
+
); diff --git a/src/components/BalanceDisplay/index.tsx b/src/components/BalanceDisplay/index.tsx index 0cb2089..96d94a8 100644 --- a/src/components/BalanceDisplay/index.tsx +++ b/src/components/BalanceDisplay/index.tsx @@ -13,7 +13,7 @@ export function BalanceDisplay() { address: collateralTokenAddress, functionName: 'balanceOf', account: address, - args: [address], + args: [address as `0x${string}`], abi: [ { constant: true, @@ -32,7 +32,7 @@ export function BalanceDisplay() { } if (isPending) return
Loading...
; - + // @ts-ignore-error if (error) return
Error: {(error as BaseError).shortMessage || error.message}
; return
Balance: {balance?.toString()}
; diff --git a/src/components/Navbar/nav-desktop.tsx b/src/components/Navbar/nav-desktop.tsx new file mode 100644 index 0000000..d99d3b8 --- /dev/null +++ b/src/components/Navbar/nav-desktop.tsx @@ -0,0 +1,25 @@ +//📂./src/components/nav-desktop.tsx + +import { routes } from "../../routes"; + +export const NavDesktop = () => { + // lg:flex md:flex md:items-center gap-5 text-sm + return ( +
    + {routes.map((route) => { + const { href, title } = route; + return ( +
  • + + {title} + +
  • + ); + })} +
  • +
+ ); +}; diff --git a/src/components/Navbar/nav-mobile.tsx b/src/components/Navbar/nav-mobile.tsx new file mode 100644 index 0000000..3745963 --- /dev/null +++ b/src/components/Navbar/nav-mobile.tsx @@ -0,0 +1,46 @@ +import { useClickAway } from "react-use"; +import { useRef } from "react"; +import { useState } from 'react'; +import '../../App.css'; +import { Link, useLocation } from 'react-router-dom'; +import { HamburgerMenuIcon } from '@radix-ui/react-icons'; +import { SheetContent, SheetHeader, SheetTitle, Sheet } from '../ui/sheet'; +import classNames from 'classnames'; +import { routes } from "../../routes"; + +export const NavMobile = () => { + const [menuOpen, setMenuOpen] = useState(false); + const location = useLocation(); + const ref = useRef(null); + + useClickAway(ref, () => setMenuOpen(false)); + // lg:hidden md:hidden + return ( +
+ + setMenuOpen(true)} /> + + + Menu + +
+ {routes.map((route) => { + const { href, title,icon } = route; + return ( + setMenuOpen(false)} + > + {title} {icon} + + ); + })} +
+
+
+
+ ); +}; diff --git a/src/components/Navbar/topbar.tsx b/src/components/Navbar/topbar.tsx new file mode 100644 index 0000000..721074b --- /dev/null +++ b/src/components/Navbar/topbar.tsx @@ -0,0 +1,22 @@ +import { NavMobile } from "./nav-mobile"; +// import { NavDesktop } from "./nav-desktop"; +//
+// +// +//
+ + +export const Topbar = () => { + return ( +
+ +
+ ); +}; diff --git a/src/components/OpenPositionList/index.tsx b/src/components/OpenPositionList/index.tsx index 84e93cb..34ab145 100644 --- a/src/components/OpenPositionList/index.tsx +++ b/src/components/OpenPositionList/index.tsx @@ -20,10 +20,12 @@ import { Market } from '@/types'; import { Asset } from '../Asset'; import { PRICE_PRECISION } from '@/lib/constants'; import { useMarketStore } from '@/store'; -import { useEffect, useMemo } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { Spinner } from '../ui/spinner'; import { toast } from 'sonner'; import { Pnl } from '../Pnl'; +import { Drawer, DrawerContent, DrawerHeader } from '@/components/ui/drawer.tsx'; +import { TradingViewChart } from '@/components/TradingView'; const openPositionsSubscription = graphql(/* GraphQL */ ` subscription getPositions($owner: String!) { @@ -50,6 +52,7 @@ interface PositionProps { isLong: boolean; market: Market; pairName: string; + onOpenChart: (open: boolean) => void } const Position = ({ @@ -60,8 +63,9 @@ const Position = ({ isLong, market, pairName, + onOpenChart, }: PositionProps) => { - const { marketsState } = useMarketStore(); + const { marketsState, setCurrentMarket } = useMarketStore(); const { writeContract: writeContractClosePosition, @@ -93,6 +97,11 @@ const Position = ({ }); }; + const handleOpenChart = () => { + setCurrentMarket(market) + onOpenChart(true) + } + const showSpinner = useMemo( () => statusClosePosition === 'pending' || isConfirmingClosePosition, [statusClosePosition, isConfirmingClosePosition] @@ -147,13 +156,17 @@ const Position = ({
-
+
+
+

{currentPrice ? formatPrice(currentPrice) : '$ ...'}

+

observe in graph

+

Collateral:

@@ -171,10 +184,6 @@ const Position = ({

Entry Price:

${formatDynamicPrecisionPrice(Number(entryPrice) / PRICE_PRECISION)}

-
-

Current Price:

-

{currentPrice ? formatPrice(currentPrice) : '$...'}

-

Current PnL:

@@ -195,6 +204,7 @@ const Position = ({ export function OpenPositionList() { const { address, status } = useAccount(); + const [isTradingChartOpen, setIsTradingChartOpen] = useState(false); const [result] = useSubscription({ query: openPositionsSubscription, @@ -218,21 +228,32 @@ export function OpenPositionList() {
{data && data.Position.length !== 0 ? ( - data.Position.map(position => ( - - )).reverse() - ) : ( -
No open positions.
- )} + <> + {data.Position.map(position => ( + + )).reverse() + } + + + + + + + + ) + : ( +
No open positions.
+ )}
); diff --git a/src/components/ui/carousel.tsx b/src/components/ui/carousel.tsx index 0050f84..d64fad3 100644 --- a/src/components/ui/carousel.tsx +++ b/src/components/ui/carousel.tsx @@ -181,8 +181,8 @@ const CarouselPrevious = React.forwardRef, VariantProps { @@ -39,6 +39,7 @@ const Slider = React.forwardRef( return ( }", + icon: "" + }, + { + title: "Get Started", + href: "/get-started", + element: "{}", + icon: "🚀" + }, + { + title: "Exchange", + href: "/exchange", + element: "{}", + icon: "" + }, + { + title: "Open Positions", + href: "/open-positions", + element: "{}", + icon: "" + }, + { + title: "Closed Positions", + href: "/closed-positions", + element: "{}", + icon: "" + }, + { + title: "Pool", + href: "/pool", + element: "{}", + icon: "" + }, +]; diff --git a/src/types.ts b/src/types.ts index 10290a9..9c0c867 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,4 @@ -import { config } from './lib/wagmiConfig'; +// import { config } from './lib/wagmiConfig'; export enum Market { IOTAUSD = 'IOTAUSD', @@ -10,8 +10,8 @@ export enum Market { // SHIBUSD = 'SHIBUSD', } -declare module 'wagmi' { - interface Register { - config: typeof config; - } -} +// declare module 'wagmi' { +// interface Register { +// config: typeof config; +// } +// } diff --git a/src/views/Exchange/index.tsx b/src/views/Exchange/index.tsx index 72b8fc8..53d6492 100644 --- a/src/views/Exchange/index.tsx +++ b/src/views/Exchange/index.tsx @@ -89,6 +89,7 @@ export const Exchange = () => { address: collateralTokenAddress, abi: erc20Abi, functionName: 'balanceOf', + // @ts-ignore-error args: [address], }); @@ -96,6 +97,7 @@ export const Exchange = () => { address: collateralTokenAddress, abi: erc20Abi, functionName: 'allowance', + // @ts-ignore-error args: [address, tradePairAddress], }); @@ -209,6 +211,7 @@ export const Exchange = () => { address: tradePairAddress, abi: TradePairAbi, functionName: 'openPosition', + // @ts-ignore-error args: [parsedCollateral, BigInt(leverage * 1_000_000), direction, priceFeedUpdateData], value: 1n, }); @@ -414,6 +417,7 @@ export const Exchange = () => { diff --git a/src/views/Pool/index.tsx b/src/views/Pool/index.tsx index 4a85bbf..f5db116 100644 --- a/src/views/Pool/index.tsx +++ b/src/views/Pool/index.tsx @@ -106,7 +106,8 @@ export const Pool = () => { address: liquidityPoolAddress, abi: LiquidityPoolAbi, functionName: 'balanceOf', - args: [address], + // @ts-ignore-error + args: [address as `0x${string}`], }); // TODO: this should be throttled, e.g. via debounce @@ -129,21 +130,24 @@ export const Pool = () => { address: liquidityPoolAddress, abi: LiquidityPoolAbi, functionName: 'previewRedeem', - args: [ownedShares], + // @ts-ignore-error + args: [ownedShares as bigint], }); const { data: balance, refetch: refetchBalance } = useReadContract({ address: collateralTokenAddress, abi: erc20Abi, functionName: 'balanceOf', - args: [address], + // @ts-ignore-error + args: [address as `0x${string}`], }); const { data: allowance, refetch: refetchAllowance } = useReadContract({ address: collateralTokenAddress, abi: erc20Abi, functionName: 'allowance', - args: [address, liquidityPoolAddress], + // @ts-ignore-error + args: [address as `0x${string}`, liquidityPoolAddress], }); // TODO: batch this up via multicall or serve via custom API