diff --git a/front/index.html b/front/index.html index a8022e9..d87d6b7 100644 --- a/front/index.html +++ b/front/index.html @@ -6,8 +6,16 @@ + + + + + Massa Tips diff --git a/front/package-lock.json b/front/package-lock.json index 27235e9..4f3ed32 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -59,9 +59,9 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -87,11 +87,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -99,28 +99,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -144,27 +144,27 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", - "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dependencies": { - "@babel/types": "^7.25.4", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -181,26 +181,26 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -210,68 +210,68 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -281,11 +281,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", - "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dependencies": { - "@babel/types": "^7.25.4" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -295,12 +295,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -310,12 +310,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -325,28 +325,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", - "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.4", - "@babel/parser": "^7.25.4", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -355,12 +355,12 @@ } }, "node_modules/@babel/types": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", - "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -368,9 +368,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "dev": true, "optional": true, "dependencies": { @@ -752,9 +752,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -821,9 +821,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -851,13 +851,13 @@ "integrity": "sha512-K6mLazzHkDNF5Qmx5iQ4+UqmvBJxtuwg1ZHEDEvOKB1SV/QNuKJ54/HRlLMqJE0RHam2zP7s++RlnMZUIfWgGg==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -1285,9 +1285,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -1671,9 +1671,9 @@ } }, "node_modules/@massalabs/massa-web3": { - "version": "5.0.0-next.20241003202212", - "resolved": "https://registry.npmjs.org/@massalabs/massa-web3/-/massa-web3-5.0.0-next.20241003202212.tgz", - "integrity": "sha512-/xcQQ0BlylzOeGYZUagWcBDuI4EuZ36GuAeZXEdLpVWdGQDyOHgOQxB4NEEIF5+lthFHQ3SdSqVpwVNaZq4O2w==", + "version": "5.0.0-next.20241010100703", + "resolved": "https://registry.npmjs.org/@massalabs/massa-web3/-/massa-web3-5.0.0-next.20241010100703.tgz", + "integrity": "sha512-+5ptcVPR8swwm5D1vDGdeE1ZcMz8VpaVXj+r2o8aqcEO7rSsLXpMj2S2aSGGgp2ipBShaynnxmb6TC4X3NxK5Q==", "dependencies": { "@noble/ed25519": "^1.7.3", "@noble/hashes": "^1.2.0", @@ -1685,7 +1685,6 @@ "eventemitter3": "^5.0.1", "lodash.isequal": "^4.5.0", "secure-random": "^1.1.2", - "string_decoder": "^1.3.0", "tslib": "^2.5.2", "varint": "^6.0.0" }, @@ -1704,9 +1703,9 @@ } }, "node_modules/@massalabs/react-ui-kit": { - "version": "0.1.1-dev.20240830155640", - "resolved": "https://registry.npmjs.org/@massalabs/react-ui-kit/-/react-ui-kit-0.1.1-dev.20240830155640.tgz", - "integrity": "sha512-RGfW+gDDtSEYr74TBA48DD4/R7wNFrQAuq/CetdGdDvFZygPJY+a6aceazxJtr45O7mnt6uYGStFqejUTgngiA==", + "version": "0.1.1-dev.20241014105429", + "resolved": "https://registry.npmjs.org/@massalabs/react-ui-kit/-/react-ui-kit-0.1.1-dev.20241014105429.tgz", + "integrity": "sha512-+eIoXYyOsHXy+XR0ViVH8HmJ6WJjWtC8JIqmixFT56bz5qU/3JBAGEuoqjB6RSAVdVtwOYyVCBZmpCMddnSNjQ==", "dependencies": { "@headlessui/react": "^1.7.15", "@massalabs/massa-web3": "^5.0.0-next", @@ -2117,9 +2116,9 @@ } }, "node_modules/@massalabs/react-ui-kit/node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "peer": true, "bin": { "rollup": "dist/bin/rollup" @@ -2146,9 +2145,9 @@ } }, "node_modules/@massalabs/react-ui-kit/node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "peer": true, "dependencies": { "esbuild": "^0.18.10", @@ -2257,11 +2256,14 @@ } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -2279,11 +2281,11 @@ ] }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -2418,9 +2420,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", - "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", "engines": { "node": ">=14.0.0" } @@ -2447,9 +2449,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", + "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -2468,9 +2470,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", - "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], @@ -2480,9 +2482,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", - "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], @@ -2492,9 +2494,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", - "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], @@ -2504,9 +2506,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", - "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], @@ -2516,9 +2518,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", - "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", "cpu": [ "arm" ], @@ -2528,9 +2530,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", - "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], @@ -2540,9 +2542,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", - "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], @@ -2552,9 +2554,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", - "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], @@ -2564,9 +2566,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", - "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", "cpu": [ "ppc64" ], @@ -2576,9 +2578,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", - "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], @@ -2588,9 +2590,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", - "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", "cpu": [ "s390x" ], @@ -2600,9 +2602,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz", - "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], @@ -2612,9 +2614,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", - "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], @@ -2624,9 +2626,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", - "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], @@ -2636,9 +2638,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", - "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], @@ -2648,9 +2650,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", - "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], @@ -2659,34 +2661,40 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@scure/base": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", - "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -2894,9 +2902,9 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.8.tgz", - "integrity": "sha512-DJs7B7NPD0JH7BVvdHWNviWmunlFhuEkz7FyFxE4japOWYMLl9b1D6+Z9mivJJPWr6AEbmlPqgiFRyLwFB1SgQ==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz", + "integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==", "dev": true, "dependencies": { "mini-svg-data-uri": "^1.2.3" @@ -2906,11 +2914,11 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.4.tgz", - "integrity": "sha512-Y2y1QJN3e5gNTG4wlZcoW2IAFrVCuho80oyeODKKFVSbAhJAXmkDNH3ZztM6EQij5ueqpqgz5FlsgKP9TGjImA==", + "version": "3.10.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz", + "integrity": "sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==", "dependencies": { - "@tanstack/virtual-core": "3.10.4" + "@tanstack/virtual-core": "3.10.8" }, "funding": { "type": "github", @@ -2922,9 +2930,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.4.tgz", - "integrity": "sha512-yHyli4RHVsI+eJ0RjmOsjA9RpHp3/Zah9t+iRjmFa72dq00TeG/NwuLYuCV6CB4RkWD4i5RD421j1eb6BdKgvQ==", + "version": "3.10.8", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.8.tgz", + "integrity": "sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -2987,9 +2995,9 @@ "dev": true }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/events": { "version": "3.0.3", @@ -3010,24 +3018,24 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", "devOptional": true, "dependencies": { "undici-types": "~6.19.2" } }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "devOptional": true }, "node_modules/@types/react": { - "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", - "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -3035,9 +3043,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dev": true, "dependencies": { "@types/react": "*" @@ -3241,14 +3249,14 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", "dev": true, "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, @@ -3260,9 +3268,9 @@ } }, "node_modules/abitype": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz", - "integrity": "sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -3533,9 +3541,9 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assemblyscript": { - "version": "0.27.29", - "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.27.29.tgz", - "integrity": "sha512-pH6udb7aE2F0t6cTh+0uCepmucykhMnAmm7k0kkAU3SY7LvpIngEBZWM6p5VCguu4EpmKGwEuZpZbEXzJ/frHQ==", + "version": "0.27.30", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.27.30.tgz", + "integrity": "sha512-tSlwbLEDM1X+w/6/Y2psc3sEg9/7r+m7xv44G6FI2G/w1MNnnulLxcPo7FN0kVIBoD/oxCiRFGaQAanFY0gPhA==", "dev": true, "peer": true, "dependencies": { @@ -3802,12 +3810,16 @@ } }, "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/browserify-sign": { @@ -3876,9 +3888,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -3894,8 +3906,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -3923,6 +3935,29 @@ "bs58": "^6.0.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3998,9 +4033,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001653", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", - "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "funding": [ { "type": "opencollective", @@ -4116,9 +4151,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -4605,11 +4640,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4875,9 +4910,9 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==" }, "node_modules/elliptic": { "version": "6.5.7", @@ -5113,9 +5148,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -5129,16 +5164,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -5228,9 +5264,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", - "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -5263,34 +5299,36 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -5383,9 +5421,9 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5395,14 +5433,14 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5437,9 +5475,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz", - "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", + "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", "dev": true, "peerDependencies": { "eslint": ">=7" @@ -5833,9 +5871,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -5875,9 +5913,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -5985,9 +6023,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "engines": { "node": ">=18" @@ -6139,9 +6177,9 @@ } }, "node_modules/goober": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz", - "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", "peerDependencies": { "csstype": "^3.0.10" } @@ -6308,9 +6346,9 @@ } }, "node_modules/husky": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.5.tgz", - "integrity": "sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, "bin": { "husky": "bin.js" @@ -6797,13 +6835,13 @@ } }, "node_modules/isows": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.4.tgz", - "integrity": "sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" + "url": "https://github.com/sponsors/wevm" } ], "peerDependencies": { @@ -6864,14 +6902,14 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -6963,9 +7001,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.9.tgz", - "integrity": "sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==", + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", "dev": true, "dependencies": { "chalk": "~5.3.0", @@ -6974,7 +7012,7 @@ "execa": "~8.0.1", "lilconfig": "~3.1.2", "listr2": "~8.2.4", - "micromatch": "~4.0.7", + "micromatch": "~4.0.8", "pidtree": "~0.6.0", "string-argv": "~0.3.2", "yaml": "~2.5.0" @@ -7011,9 +7049,9 @@ } }, "node_modules/listr2": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", - "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", @@ -7083,9 +7121,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -7187,9 +7225,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -7363,9 +7401,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.45", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", - "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", "dependencies": { "moment": "^2.29.4" }, @@ -7374,9 +7412,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mz": { "version": "2.7.0", @@ -7446,9 +7484,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -7462,9 +7500,9 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/node-stdlib-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz", - "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.1.tgz", + "integrity": "sha512-dZezG3D88Lg22DwyjsDuUs7cCT/XGr8WwJgg/S3ZnkcWuPet2Tt/W1d2Eytb1Z73JpZv+XVCDI5TWv6UMRq0Gg==", "dependencies": { "assert": "^2.0.0", "browser-resolve": "^2.0.0", @@ -7490,7 +7528,7 @@ "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.1", - "url": "^0.11.0", + "url": "^0.11.4", "util": "^0.12.4", "vm-browserify": "^1.0.1" }, @@ -7498,29 +7536,6 @@ "node": ">=10" } }, - "node_modules/node-stdlib-browser/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/node-stdlib-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7789,9 +7804,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/pako": { "version": "1.0.11", @@ -7826,9 +7841,9 @@ } }, "node_modules/parse-imports": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", - "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", "dev": true, "dependencies": { "es-module-lexer": "^1.5.3", @@ -7939,9 +7954,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8002,9 +8017,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -8021,8 +8036,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -8319,9 +8334,9 @@ } }, "node_modules/react-number-format": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.1.tgz", - "integrity": "sha512-NICOjo/70dcAiwVmH6zMWoZrTQDlBrEXV/f7S0t/ewlpzp4z00pasg5G1yBX6NHLafwOF3QZ+VvK/XApwSKxdA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.2.tgz", + "integrity": "sha512-cg//jVdS49PYDgmcYoBnMMHl4XNTMuV723ZnHD2aXYtWWWqbVF3hjQ8iB+UZEuXapLbeA8P8H+1o6ZB1lcw3vg==", "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" @@ -8337,11 +8352,11 @@ } }, "node_modules/react-router": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", - "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", "dependencies": { - "@remix-run/router": "1.19.1" + "@remix-run/router": "1.20.0" }, "engines": { "node": ">=14.0.0" @@ -8351,12 +8366,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", - "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", "dependencies": { - "@remix-run/router": "1.19.1", - "react-router": "6.26.1" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" }, "engines": { "node": ">=14.0.0" @@ -8399,15 +8414,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -8521,11 +8536,11 @@ } }, "node_modules/rollup": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz", - "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -8535,22 +8550,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.1", - "@rollup/rollup-android-arm64": "4.21.1", - "@rollup/rollup-darwin-arm64": "4.21.1", - "@rollup/rollup-darwin-x64": "4.21.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", - "@rollup/rollup-linux-arm-musleabihf": "4.21.1", - "@rollup/rollup-linux-arm64-gnu": "4.21.1", - "@rollup/rollup-linux-arm64-musl": "4.21.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", - "@rollup/rollup-linux-riscv64-gnu": "4.21.1", - "@rollup/rollup-linux-s390x-gnu": "4.21.1", - "@rollup/rollup-linux-x64-gnu": "4.21.1", - "@rollup/rollup-linux-x64-musl": "4.21.1", - "@rollup/rollup-win32-arm64-msvc": "4.21.1", - "@rollup/rollup-win32-ia32-msvc": "4.21.1", - "@rollup/rollup-win32-x64-msvc": "4.21.1", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -8580,15 +8595,6 @@ } } }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8885,18 +8891,18 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -8911,6 +8917,15 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -9233,9 +9248,9 @@ } }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, "dependencies": { "@pkgr/core": "^0.1.0", @@ -9249,9 +9264,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -9293,9 +9308,9 @@ } }, "node_modules/terser": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.0.tgz", - "integrity": "sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ==", + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", + "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", "devOptional": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -9454,9 +9469,9 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, "node_modules/tw-colors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tw-colors/-/tw-colors-3.3.1.tgz", - "integrity": "sha512-PH6NShNtDzPCm6zjl0SZe3kmdYSfDS7Sk4mWa9+KzaeSH1ZmpLRrBjZoBJKaFcDB3o7iuFPPg9+HtW05pGPQyQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tw-colors/-/tw-colors-3.3.2.tgz", + "integrity": "sha512-TosYI43Jec/KO4NPzDoBlccPPtPMYholoRUSVYGmzCGa1Zek9exDQIQ+6UViHqqK6Nti/4wBzEGyRTxMSNnSXQ==", "dependencies": { "color": "^4.2.3", "flat": "^5.0.2", @@ -9564,9 +9579,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -9606,9 +9621,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -9624,8 +9639,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9703,9 +9718,9 @@ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, "node_modules/viem": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.20.1.tgz", - "integrity": "sha512-a/BSe25TSfkc423GTSKYl1O0ON2J5huoQeOLkylHT1WS8wh3JFqb8nfAq7vg+aZ+W06BCTn36bbi47yp4D92Cg==", + "version": "2.21.25", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.25.tgz", + "integrity": "sha512-fQbFLVW5RjC1MwjelmzzDygmc2qMfY17NruAIIdYeiB8diQfhqsczU5zdGw/jTbmNXbKoYnSdgqMb8MFZcbZ1w==", "funding": [ { "type": "github", @@ -9713,15 +9728,15 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.4.0", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0", - "abitype": "1.0.5", - "isows": "1.0.4", - "webauthn-p256": "0.0.5", - "ws": "8.17.1" + "@adraffy/ens-normalize": "1.11.0", + "@noble/curves": "1.6.0", + "@noble/hashes": "1.5.0", + "@scure/bip32": "1.5.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.6", + "isows": "1.0.6", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -9733,12 +9748,12 @@ } }, "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.41", + "postcss": "^8.4.43", "rollup": "^4.20.0" }, "bin": { @@ -10231,9 +10246,9 @@ "dev": true }, "node_modules/webauthn-p256": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.5.tgz", - "integrity": "sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", "funding": [ { "type": "github", @@ -10386,9 +10401,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -10453,9 +10468,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -10495,9 +10510,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "bin": { "yaml": "bin.mjs" }, diff --git a/front/src/App.tsx b/front/src/App.tsx index 73789e3..ab4e905 100644 --- a/front/src/App.tsx +++ b/front/src/App.tsx @@ -9,7 +9,7 @@ import { Toast } from '@massalabs/react-ui-kit'; import HomePage from './pages/HomePage'; import useAccountSync from './hooks/useAccountAsync'; -import { useInit } from './services/useInit'; +import { useInit } from './hooks/useInit'; function App() { useAccountSync(); diff --git a/front/src/components/AllowanceButton.tsx b/front/src/components/AllowanceButton.tsx new file mode 100644 index 0000000..1ca6915 --- /dev/null +++ b/front/src/components/AllowanceButton.tsx @@ -0,0 +1,35 @@ +import useToken from '@/hooks/useToken'; +import { ScheduleInfo } from '@/store/scheduler'; +import { commonButton } from '@/styles/buttons'; +import { Button, formatAmount } from '@massalabs/react-ui-kit'; + +export function AllowanceButton({ + scheduleInfo, + disabled, +}: { + scheduleInfo: ScheduleInfo; + disabled: boolean; +}) { + const { increaseAllowance } = useToken(); + + if (disabled) { + return; + } + + return ( + + ); +} diff --git a/front/src/components/ArrowButton.tsx b/front/src/components/ArrowButton.tsx new file mode 100644 index 0000000..423e27e --- /dev/null +++ b/front/src/components/ArrowButton.tsx @@ -0,0 +1,12 @@ +export function ArrowButton({ onClick }: { onClick: () => void }) { + return ( + + ); +} diff --git a/front/src/components/CheckBox.tsx b/front/src/components/CheckBox.tsx index 84cc302..2f9ec4a 100644 --- a/front/src/components/CheckBox.tsx +++ b/front/src/components/CheckBox.tsx @@ -12,20 +12,17 @@ const CheckBox: React.FC = ({ isSelected, }: CheckBoxProps) => { return ( -
- Checkboxes -
- -
+
+
); }; diff --git a/front/src/components/ConnectWalletPopup/ConnectButton.tsx b/front/src/components/ConnectWalletPopup/ConnectButton.tsx index 72a46fb..bf1d616 100644 --- a/front/src/components/ConnectWalletPopup/ConnectButton.tsx +++ b/front/src/components/ConnectWalletPopup/ConnectButton.tsx @@ -15,7 +15,7 @@ export function ConnectButton() { + ); +} diff --git a/front/src/components/ModeRadioButton.tsx b/front/src/components/ModeRadioButton.tsx new file mode 100644 index 0000000..d4482fa --- /dev/null +++ b/front/src/components/ModeRadioButton.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import { Tooltip } from '@massalabs/react-ui-kit'; +import { FiInfo } from 'react-icons/fi'; + +interface ModeRadioButtonProps { + isVesting: boolean; + handleModeChange: (e: React.ChangeEvent) => void; + mode: string; + modeDesc: string; + disabled?: boolean; +} + +const ModeRadioButton: React.FC = ({ + isVesting, + handleModeChange, + mode, + modeDesc, + disabled, +}) => { + return ( + + ); +}; + +export default ModeRadioButton; diff --git a/front/src/components/NavBar.tsx b/front/src/components/NavBar.tsx new file mode 100644 index 0000000..d3caa5b --- /dev/null +++ b/front/src/components/NavBar.tsx @@ -0,0 +1,18 @@ +import { ConnectButton } from './ConnectWalletPopup'; +import LogoSyntra from '../assets/logo-syntra.svg'; +import { useNetworkStore } from '@/store/network'; + +export function NavBar() { + const { network } = useNetworkStore(); + return ( + + ); +} diff --git a/front/src/components/NumericInput.tsx b/front/src/components/NumericInput.tsx index eed1f3e..9e1f5a2 100644 --- a/front/src/components/NumericInput.tsx +++ b/front/src/components/NumericInput.tsx @@ -9,11 +9,11 @@ type NumericInputProps = { onValueChange: (e: string) => void; asset?: Asset; error?: string; + disabled?: boolean; }; -// TODO: To add in ui-kit export function NumericInput(props: NumericInputProps) { - const { value, placeholder, asset, onValueChange, error } = props; + let { value, placeholder, asset, onValueChange, error, disabled } = props; const [amountError, setAmountError] = useState(''); @@ -31,7 +31,11 @@ export function NumericInput(props: NumericInputProps) { return (
onValueChange(o.value)} placeholder={placeholder} diff --git a/front/src/components/RecipientAddressInput.tsx b/front/src/components/RecipientAddressInput.tsx index 7143336..5f8e0a5 100644 --- a/front/src/components/RecipientAddressInput.tsx +++ b/front/src/components/RecipientAddressInput.tsx @@ -1,18 +1,21 @@ -import { Input } from '@massalabs/react-ui-kit'; +import { Input, useAccountStore } from '@massalabs/react-ui-kit'; import { useState } from 'react'; import { isValidAddress } from '../utils/address'; +import { InputLabel } from './InputLabel'; interface RecipientAddressInputProps { value: string; onAddressChange: (address: string) => void; - error?: string; + disabled?: boolean; } export function RecipientAddressInput({ value, onAddressChange, + disabled, }: RecipientAddressInputProps) { const [error, setError] = useState(''); + const { connectedAccount } = useAccountStore(); function onChange(e: React.ChangeEvent) { onAddressChange(e.target.value); setError(''); @@ -27,15 +30,26 @@ export function RecipientAddressInput({ if (!isValidAddress(value)) { setError('Invalid address'); } + + if (value === connectedAccount?.address) { + setError('Spender can not be the same as recipient'); + } } return ( - + <> + + + ); } diff --git a/front/src/components/Recurrence.tsx b/front/src/components/Recurrence.tsx index 191c019..ebecfb7 100644 --- a/front/src/components/Recurrence.tsx +++ b/front/src/components/Recurrence.tsx @@ -1,24 +1,68 @@ import { useEffect, useRef, useState } from 'react'; import { Dropdown } from '@massalabs/react-ui-kit'; import Intl from '@/i18n/i18n'; -import { NumericInput } from './NumericInput'; import { InputLabel } from './InputLabel'; +import { NumericInput } from './NumericInput'; const periodInMilliseconds = 16 * 1000; // 16 seconds const recurrenceUnits = [ - { name: Intl.t('recurrence.minute'), milliseconds: 60 * 1000 }, - { name: Intl.t('recurrence.hour'), milliseconds: 60 * 60 * 1000 }, - { name: Intl.t('recurrence.day'), milliseconds: 24 * 60 * 60 * 1000 }, - { name: Intl.t('recurrence.week'), milliseconds: 7 * 24 * 60 * 60 * 1000 }, - { name: Intl.t('recurrence.month'), milliseconds: 30 * 24 * 60 * 60 * 1000 }, - { name: Intl.t('recurrence.year'), milliseconds: 365 * 24 * 60 * 60 * 1000 }, + { name: Intl.t('recurrence.minute'), milliseconds: 60 * 1000, periods: 225 }, + { + name: Intl.t('recurrence.hour'), + milliseconds: 60 * 60 * 1000, + periods: 225, + }, + { + name: Intl.t('recurrence.day'), + milliseconds: 24 * 60 * 60 * 1000, + periods: 5400, + }, + { + name: Intl.t('recurrence.week'), + milliseconds: 7 * 24 * 60 * 60 * 1000, + periods: 37800, + }, + { + name: Intl.t('recurrence.month'), + milliseconds: 30 * 24 * 60 * 60 * 1000, + periods: 162000, + }, + { + name: Intl.t('recurrence.year'), + milliseconds: 365 * 24 * 60 * 60 * 1000, + periods: 1971000, + }, ]; +export function getRecurrenceFromPeriods(periods: bigint) { + const totalMilliseconds = BigInt(periods) * BigInt(periodInMilliseconds); + + // Iterate from largest to smallest unit + for (let i = recurrenceUnits.length - 1; i >= 0; i--) { + const unit = recurrenceUnits[i]; + const unitMilliseconds = BigInt(unit.milliseconds); + + if (totalMilliseconds >= unitMilliseconds) { + const numUnits = Number(totalMilliseconds / unitMilliseconds); + return { unit: unit.name, value: numUnits }; + } + } + + // Fallback to the smallest unit (should rarely happen with given units) + const smallestUnit = recurrenceUnits[0]; + return { + unit: smallestUnit.name, + value: Number(totalMilliseconds / BigInt(smallestUnit.milliseconds)), + }; +} + export function Recurrence({ onRecurrenceChange, + disabled, }: { onRecurrenceChange: (value: bigint) => void; + disabled?: boolean; }) { const [unitIndex, setUnitIndex] = useState(4); const [numUnits, setNumUnits] = useState(1); @@ -58,17 +102,26 @@ export function Recurrence({ value={numUnits.toString()} placeholder={'0'} onValueChange={handleNumUnitsChange} + disabled={disabled} />
- ({ - item: unit.name, - onClick: () => handleUnitChange(index), - }))} - /> +
+ ({ + item: unit.name, + onClick: () => handleUnitChange(index), + }))} + /> +
); diff --git a/front/src/components/RepeatInput.tsx b/front/src/components/RepeatInput.tsx new file mode 100644 index 0000000..f4cdc67 --- /dev/null +++ b/front/src/components/RepeatInput.tsx @@ -0,0 +1,24 @@ +import { InputLabel } from './InputLabel'; +import { NumericInput } from './NumericInput'; + +export function RepeatInput({ + onValueChange, + occurrences, + disabled, +}: { + onValueChange: (repeat: string) => void; + occurrences: string; + disabled?: boolean; +}) { + return ( + <> + + + + ); +} diff --git a/front/src/components/ScheduleForm.tsx b/front/src/components/ScheduleForm.tsx new file mode 100644 index 0000000..fda01ab --- /dev/null +++ b/front/src/components/ScheduleForm.tsx @@ -0,0 +1,148 @@ +import { parseUnits } from '@massalabs/massa-web3'; +import { useAccountStore } from '@massalabs/react-ui-kit'; +import { Card } from '@massalabs/react-ui-kit/src/components/Card/Card'; +import { RecipientAddressInput } from './RecipientAddressInput'; +import { Recurrence } from './Recurrence'; +import { SelectAmount } from './SelectAmount'; +import SelectAsset from './SelectAsset'; +import { SelectMode } from './SelectMode'; +import useSchedule from '@/hooks/useSchedule'; +import { useTokenStore } from '@/store/token'; +import { isValidAddress } from '@/utils/address'; +import { useState } from 'react'; +import { AllowanceButton } from './AllowanceButton'; +import { tipsModeDesc, vestingModeDesc } from '@/const/tooltips'; +import { RepeatInput } from './RepeatInput'; +import { CreateScheduleButton } from './CreateScheduleButton'; +import { useNetworkStore } from '@/store/network'; + +export function ScheduleForm() { + const { connectedAccount, network: walletNetwork } = useAccountStore(); + const { scheduleInfo, setScheduleInfo } = useSchedule(); + const { tokens } = useTokenStore(); + const [isVesting, setVesting] = useState(scheduleInfo.isVesting); + + const { network } = useNetworkStore(); + + const selectedToken = tokens.find( + (token) => token.address === scheduleInfo.asset.address, + ); + const isMasToken = scheduleInfo.asset.address === ''; + const isValidRecipient = isValidAddress(scheduleInfo.recipient); + + const balance = selectedToken?.balance ?? 0n; + const insufficientBalance = balance < scheduleInfo.amount; + + const isAllowanceSufficient = + (selectedToken?.allowance ?? 0) >= + scheduleInfo.amount * scheduleInfo.occurrences; + + const disableAllowanceButton = [ + !isValidRecipient, + !connectedAccount, + scheduleInfo.amount === 0n, + !scheduleInfo.asset, + isAllowanceSufficient, + insufficientBalance, + isMasToken, + isVesting, + ].some(Boolean); + + const disableCreateScheduleButton = [ + !isValidRecipient, + !connectedAccount, + scheduleInfo.amount === 0n, + !isAllowanceSufficient && !isMasToken, + ].some(Boolean); + + const isRightNetwork = network === walletNetwork; + const formDisabled = !connectedAccount || !isRightNetwork; + + const handleModeChange = (e: React.ChangeEvent) => { + const isChecked = e.target.checked; + const value = e.target.value; + + setScheduleInfo('amount', 0n); + if (isChecked) { + const isVesting = value === 'vesting'; + setVesting(isVesting); + setScheduleInfo('isVesting', isVesting); + } + }; + + return ( +
+ {walletNetwork && !isRightNetwork && ( +

+ Please switch your wallet to {network} +

+ )} + + + +
+
+ { + setScheduleInfo( + 'amount', + parseUnits(amount, scheduleInfo.asset.decimals), + ); + }} + disabled={formDisabled} + /> +
+
+ +
+
+ +
+ { + setScheduleInfo('recipient', address); + }} + disabled={formDisabled} + /> +
+ +
+
+ { + setScheduleInfo('interval', BigInt(value)); + }} + disabled={formDisabled} + /> +
+ +
+ { + setScheduleInfo('occurrences', BigInt(value)); + }} + disabled={formDisabled} + /> +
+
+ +
+ + +
+
+
+ ); +} diff --git a/front/src/components/scheduleHistory.tsx b/front/src/components/ScheduleHistory.tsx similarity index 97% rename from front/src/components/scheduleHistory.tsx rename to front/src/components/ScheduleHistory.tsx index 9298b92..d677ce2 100644 --- a/front/src/components/scheduleHistory.tsx +++ b/front/src/components/ScheduleHistory.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { Schedule } from '../serializable/Schedule'; import { useAccountStore } from '@massalabs/react-ui-kit'; -import useSchedule from '../services/useSchedule'; +import useSchedule from '../hooks/useSchedule'; interface ScheduleHistoryProps { schedule: Schedule; diff --git a/front/src/components/ScheduleTable.tsx b/front/src/components/ScheduleTable.tsx new file mode 100644 index 0000000..647d370 --- /dev/null +++ b/front/src/components/ScheduleTable.tsx @@ -0,0 +1,185 @@ +import React, { useState } from 'react'; +import { Schedule } from '@/serializable/Schedule'; +import { truncateAddress } from '@/utils/address'; +import { formatAmount, toast } from '@massalabs/react-ui-kit'; +import CheckBox from './CheckBox'; +import useSchedule from '@/hooks/useSchedule'; +import { MasToken } from '../const/assets'; +import ScheduleHistory from '@/components/ScheduleHistory'; +import { getRecurrenceFromPeriods } from './Recurrence'; +import { useTokenStore } from '@/store/token'; + +interface ScheduleTableProps { + schedules: Schedule[]; +} + +const CopyableAddress: React.FC<{ + address: string; + label: string; + value: string; +}> = ({ value, address, label }) => ( + { + navigator.clipboard.writeText(address); + toast.success(`${label} copied to clipboard`); + }} + > + {value} + +); + +const TableHeader: React.FC = () => ( + + + + + OperationId + + Mode + Token + Recipient + Amount + Interval + + Occurrences + + Remaining + + Execution history + + + +); + +interface TableRowProps { + schedule: Schedule; + isSelected: boolean; + onCheckboxChange: (id: bigint, checked: boolean) => void; +} + +const TableRow: React.FC = ({ + schedule, + isSelected, + onCheckboxChange, +}) => { + const { tokens } = useTokenStore(); + const asset = + tokens.find((token) => token.address === schedule.tokenAddress) || MasToken; + const formattedAmount = formatAmount(schedule.amount, asset.decimals); + const isMas = schedule.tokenAddress === ''; + return ( + + + + + + + + + {schedule.isVesting ? 'Vesting' : 'Tips'} + + + {isMas ? ( + 'MAS' + ) : ( + + )} + + + + + + {formattedAmount.preview} + + + {getRecurrenceFromPeriods(schedule.interval).unit} + + + {schedule.occurrences.toString()} + + {schedule.remaining.toString()} + + + + + ); +}; + +const SelectedInfo: React.FC<{ count: number; onCancel: () => void }> = ({ + count, + onCancel, +}) => ( +
+
{count} selected
+ +
+); + +const ScheduleTable: React.FC = ({ schedules }) => { + const [selected, setSelected] = useState([]); + const { cancelSchedules } = useSchedule(); + + const handleCheckbox = (id: bigint, checked: boolean) => { + setSelected((prevSelected) => + checked + ? [...prevSelected, id] + : prevSelected.filter((item) => item !== id), + ); + }; + + const handleCancel = async () => { + try { + await cancelSchedules(selected); + setSelected([]); + } catch (error) { + toast.error('Failed to cancel schedules'); + } + }; + + return ( +
+ {selected.length > 0 && ( + + )} + + + + + {schedules.map((schedule) => ( + + ))} + +
+
+ ); +}; + +export default ScheduleTable; diff --git a/front/src/components/SelectAmount.tsx b/front/src/components/SelectAmount.tsx new file mode 100644 index 0000000..a2a747b --- /dev/null +++ b/front/src/components/SelectAmount.tsx @@ -0,0 +1,33 @@ +import { InputLabel } from './InputLabel'; +import { NumericInput } from './NumericInput'; +import { ScheduleInfo } from '@/store/scheduler'; +import { formatAmount } from '@massalabs/react-ui-kit'; + +type SelectAmountProps = { + onValueChange: (amount: string) => void; + scheduleInfo: ScheduleInfo; + disabled: boolean; +}; + +export function SelectAmount({ + scheduleInfo, + onValueChange, + disabled, +}: SelectAmountProps) { + return ( + <> + + { + onValueChange(amount); + }} + asset={scheduleInfo.asset} + value={ + formatAmount(scheduleInfo.amount, scheduleInfo.asset.decimals).full + } + disabled={disabled} + /> + + ); +} diff --git a/front/src/components/SelectAsset.tsx b/front/src/components/SelectAsset.tsx index b776ed1..446fb98 100644 --- a/front/src/components/SelectAsset.tsx +++ b/front/src/components/SelectAsset.tsx @@ -1,15 +1,19 @@ import { useState } from 'react'; -import { supportedTokens, MasToken } from '../const/assets'; import { Asset } from '@massalabs/react-ui-kit/src/lib/token/models/AssetModel'; import { AssetSelector } from '@massalabs/react-ui-kit/src/lib/token/AssetSelector'; -import useSchedule from '../services/useSchedule'; +import useSchedule from '../hooks/useSchedule'; +import { InputLabel } from './InputLabel'; +import { useTokenStore } from '@/store/token'; export default function SelectAsset({ isVesting, + disabled, }: { isVesting: boolean; + disabled: boolean; }): JSX.Element { - const tokens = isVesting ? [MasToken] : supportedTokens; + const { tokens: supportedTokens, mas } = useTokenStore.getState(); + const tokens = isVesting ? [mas] : supportedTokens; const [selectedAsset, setSelectedAsset] = useState(tokens[0]); const { setScheduleInfo } = useSchedule(); @@ -19,11 +23,20 @@ export default function SelectAsset({ } return ( - +
+ + +
); } diff --git a/front/src/components/SelectMode.tsx b/front/src/components/SelectMode.tsx new file mode 100644 index 0000000..d5ce8d1 --- /dev/null +++ b/front/src/components/SelectMode.tsx @@ -0,0 +1,38 @@ +import { InputLabel } from './InputLabel'; +import ModeRadioButton from './ModeRadioButton'; + +export function SelectMode({ + isVesting, + handleModeChange, + tipsModeDesc, + vestingModeDesc, + disabled, +}: { + isVesting: boolean; + handleModeChange: (e: React.ChangeEvent) => void; + tipsModeDesc: string; + vestingModeDesc: string; + disabled?: boolean; +}) { + return ( +
+ +
+ + +
+
+ ); +} diff --git a/front/src/components/index.ts b/front/src/components/index.ts deleted file mode 100644 index f40a870..0000000 --- a/front/src/components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './RecipientAddressInput'; -export * from './Recurrence'; -export * from './NumericInput'; -export * from './ConnectWalletPopup'; diff --git a/front/src/components/scheduleTable.tsx b/front/src/components/scheduleTable.tsx deleted file mode 100644 index f0025e4..0000000 --- a/front/src/components/scheduleTable.tsx +++ /dev/null @@ -1,209 +0,0 @@ -import { Schedule } from '@/serializable/Schedule'; -import { truncateAddress } from '@/utils/address'; -import { formatAmount, toast } from '@massalabs/react-ui-kit'; -import React, { useState } from 'react'; -import CheckBox from './CheckBox'; -import useSchedule from '@/services/useSchedule'; -import { MasToken, supportedTokens } from '../const/assets'; -import ScheduleHistory from './scheduleHistory'; - -interface ScheduleTableProps { - schedules: Schedule[]; -} - -const ScheduleTable: React.FC = ({ schedules }) => { - const [selected, setSelected] = useState([]); - const { cancelSchedules } = useSchedule(); - - const handleCheckbox = (id: bigint, checked: boolean) => { - const isSelected = selected.includes(id); - - if (!checked && isSelected) { - // remove from selected - setSelected(selected.filter((item) => item !== id)); - return; - } - if (checked && !isSelected) { - // add to selected - setSelected([...selected, id]); - return; - } - }; - - const handleCancel = async () => { - try { - await cancelSchedules(selected); - setSelected([]); - } catch (error) { - toast.error('Failed to cancel schedules'); - } - }; - - return ( -
- {selected.length > 0 && ( -
-
- {selected.length} selected -
- -
- )} - - - - - - - - - - - - - - - - - - - - - {schedules.map((schedule) => { - const asset = - supportedTokens.find( - (token) => token.address === schedule.tokenAddress, - ) || MasToken; - - const formatedAmount = formatAmount( - schedule.amount, - asset.decimals, - ); - - const isMas = schedule.tokenAddress === ''; - - return ( - - - - - - - - - - - - - - - - ); - })} - -
- ID - - OperationId - - Mode - - Token - - Spender - - Recipient - - Amount - - Interval - - Occurrences - - Remaining - - Tolerance - - Execution history -
- - - {schedule.id.toString()} - - { - navigator.clipboard.writeText(schedule.operationId); - toast.success('Operation ID copied to clipboard'); - }} - > - {truncateAddress(schedule.operationId)} - - - {schedule.isVesting ? 'Vesting' : 'Tips'} - - { - if (isMas) return; - navigator.clipboard.writeText(schedule.tokenAddress); - toast.success('Token address copied to clipboard'); - }} - > - {isMas ? 'MAS' : truncateAddress(schedule.tokenAddress)} - - - { - navigator.clipboard.writeText(schedule.spender); - toast.success('Spender address copied to clipboard'); - }} - > - {truncateAddress(schedule.spender)} - - - { - navigator.clipboard.writeText(schedule.recipient); - toast.success('Recipient address copied to clipboard'); - }} - > - {truncateAddress(schedule.recipient)} - - - - {formatedAmount.preview} - - - {schedule.interval.toString()} - - {schedule.occurrences.toString()} - - {schedule.remaining.toString()} - - {schedule.tolerance.toString()} - - -
-
- ); -}; - -export default ScheduleTable; diff --git a/front/src/const/assets.ts b/front/src/const/assets.ts index b72ecc3..597013e 100644 --- a/front/src/const/assets.ts +++ b/front/src/const/assets.ts @@ -1,57 +1,45 @@ -import { Asset } from '@massalabs/react-ui-kit/src/lib/token/models/AssetModel'; - -// buildnet -export const supportedTokens: Asset[] = [ - { - name: 'tDAI.s', - address: 'AS12LpYyAjYRJfYhyu7fkrS224gMdvFHVEeVWoeHZzMdhis7UZ3Eb', - symbol: 'tDAI.s', - decimals: 18, - balance: 0n, - allowance: 0n, - chainId: 0, - }, - { - name: 'Wrapped MASSA', - address: 'AS12FW5Rs5YN2zdpEnqwj4iHUUPt9R4Eqjq2qtpJFNKW3mn33RuLU', - symbol: 'WMAS', - decimals: 9, - balance: 0n, - allowance: 0n, - chainId: 0, - }, - { - name: 'Massa Tips', - address: 'AS1R8zaZaGZ7Xcc3NeZ41KCzkUjcurFKn7LKhquMKEKrYFZDxfxr', - symbol: 'TIPS', - decimals: 18, - balance: 0n, - allowance: 0n, - chainId: 0, - }, -]; - -// mainnet -// export const supportedTokens: Asset[] = [ -// { -// name: 'DAI.e', -// address: 'AS1ZGF1upwp9kPRvDKLxFAKRebgg7b3RWDnhgV7VvdZkZsUL7Nuv', -// symbol: 'DAI.e', -// decimals: 18, -// balance: 0n, -// allowance: 0n, -// chainId: 0, -// }, -// { -// name: 'Wrapped MASSA', -// address: 'AS12U4TZfNK7qoLyEERBBRDMu8nm5MKoRzPXDXans4v9wdATZedz9', -// symbol: 'WMAS', -// decimals: 9, -// balance: 0n, -// allowance: 0n, -// chainId: 0, -// }, -// ]; +export const supportedTokens = { + buildnet: [ + { + name: 'tDAI.s', + address: 'AS12LpYyAjYRJfYhyu7fkrS224gMdvFHVEeVWoeHZzMdhis7UZ3Eb', + symbol: 'tDAI.s', + decimals: 18, + balance: 0n, + allowance: 0n, + chainId: 0, + }, + { + name: 'Wrapped MASSA', + address: 'AS12FW5Rs5YN2zdpEnqwj4iHUUPt9R4Eqjq2qtpJFNKW3mn33RuLU', + symbol: 'WMAS', + decimals: 9, + balance: 0n, + allowance: 0n, + chainId: 0, + }, + ], + mainnet: [ + { + name: 'DAI.e', + address: 'AS1ZGF1upwp9kPRvDKLxFAKRebgg7b3RWDnhgV7VvdZkZsUL7Nuv', + symbol: 'DAI.e', + decimals: 18, + balance: 0n, + allowance: 0n, + chainId: 0, + }, + { + name: 'Wrapped MASSA', + address: 'AS12U4TZfNK7qoLyEERBBRDMu8nm5MKoRzPXDXans4v9wdATZedz9', + symbol: 'WMAS', + decimals: 9, + balance: 0n, + allowance: 0n, + chainId: 0, + }, + ], +}; export const MasToken = { name: 'MAS', diff --git a/front/src/const/contracts.ts b/front/src/const/contracts.ts index a8c138c..8b9b903 100644 --- a/front/src/const/contracts.ts +++ b/front/src/const/contracts.ts @@ -1,5 +1,4 @@ -export const schedulerAddress = - // buildnet - 'AS1FmYN5nqeUzNycSZFBYdcno4tFCgNfPfMwhPCxCZLgFJy4YMUp'; -//mainnet -//'AS1WHog6myEJg1qydeopye6VSaC4yKKhZEjPhEGAgWYMPNLsKfLf'; +export const schedulerAddress = { + buildnet: 'AS1FmYN5nqeUzNycSZFBYdcno4tFCgNfPfMwhPCxCZLgFJy4YMUp', + mainnet: 'AS1WHog6myEJg1qydeopye6VSaC4yKKhZEjPhEGAgWYMPNLsKfLf', +}; diff --git a/front/src/const/tooltips.ts b/front/src/const/tooltips.ts new file mode 100644 index 0000000..007d724 --- /dev/null +++ b/front/src/const/tooltips.ts @@ -0,0 +1,7 @@ +export const tipsModeDesc = `Once spending approval is given to the scheduler contract, +tokens are sent to the recipient address at the specified interval. +You are not required to old the total amount of tokens (amount * nbOccurrences) in your wallet.`; + +// eslint-disable-next-line max-len +export const vestingModeDesc = `Using vesting mode will require to lock the total amount of tokens (amount * nbOccurrences) +in the scheduler contract.`; diff --git a/front/src/hooks/useAccountAsync.tsx b/front/src/hooks/useAccountAsync.tsx index 8bd1a6f..9d5321d 100644 --- a/front/src/hooks/useAccountAsync.tsx +++ b/front/src/hooks/useAccountAsync.tsx @@ -9,7 +9,12 @@ type SavedAccount = { }; const useAccountSync = () => { - const { connectedAccount, setConnectedAccount } = useAccountStore(); + const { + connectedAccount, + setConnectedAccount, + setCurrentWallet, + setWallets, + } = useAccountStore(); const [savedAccount, setSavedAccount] = useLocalStorage( 'saved-account', @@ -36,17 +41,25 @@ const useAccountSync = () => { if (connectedAccount) return; getWallets().then((wallets) => { + setWallets(wallets); for (const wallet of wallets) { wallet.accounts().then((accounts) => { const acc = accounts.find((a) => a.address === address); if (acc) { setConnectedAccount(acc); + setCurrentWallet(wallet); return; } }); } }); - }, [savedAccount, connectedAccount, setConnectedAccount]); + }, [ + savedAccount, + connectedAccount, + setConnectedAccount, + setCurrentWallet, + setWallets, + ]); }; export default useAccountSync; diff --git a/front/src/services/useInit.ts b/front/src/hooks/useInit.ts similarity index 58% rename from front/src/services/useInit.ts rename to front/src/hooks/useInit.ts index ce8be4d..708915d 100644 --- a/front/src/services/useInit.ts +++ b/front/src/hooks/useInit.ts @@ -1,7 +1,8 @@ import { useEffect } from 'react'; -import { useAccountStore } from '@massalabs/react-ui-kit'; +import { toast, useAccountStore } from '@massalabs/react-ui-kit'; import { initApp } from '@/store/store'; import { useSchedulerStore } from '@/store/scheduler'; +import { useNetworkStore } from '@/store/network'; export const useInit = () => { const { connectedAccount } = useAccountStore(); @@ -20,4 +21,14 @@ export const useInit = () => { } }; }, [eventPollerStop]); + + const { network: n } = useAccountStore(); + const { network } = useNetworkStore(); + + useEffect(() => { + if (!n) return; + if (n !== network) { + toast.error(`Please switch to ${network} network`); + } + }, [network, n]); }; diff --git a/front/src/services/useSchedule.ts b/front/src/hooks/useSchedule.ts similarity index 100% rename from front/src/services/useSchedule.ts rename to front/src/hooks/useSchedule.ts diff --git a/front/src/services/useToken.ts b/front/src/hooks/useToken.ts similarity index 100% rename from front/src/services/useToken.ts rename to front/src/hooks/useToken.ts diff --git a/front/src/index.css b/front/src/index.css index 7665894..42b2550 100644 --- a/front/src/index.css +++ b/front/src/index.css @@ -1,10 +1,11 @@ #root { height: 100vh; width: 100vw; - font-family: 'Roboto', sans-serif; font-weight: 400; font-style: normal; font-synthesis: none; + font-family: 'Inter', sans-serif; + font-optical-sizing: auto; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -64,3 +65,7 @@ button { background-color: #f9f9f9; } } + +#dropdownUiKitButton { + border: 1px solid #e5e7eb; /* Equivalent of border-slate-200 */ +} diff --git a/front/src/pages/HomePage.tsx b/front/src/pages/HomePage.tsx index 56db3ee..6fffcfb 100644 --- a/front/src/pages/HomePage.tsx +++ b/front/src/pages/HomePage.tsx @@ -1,255 +1,41 @@ -import { useRef, useState } from 'react'; -import { NumericInput, RecipientAddressInput, Recurrence } from '@/components'; -import { - Button, - formatAmount, - toast, - Tooltip, - useAccountStore, -} from '@massalabs/react-ui-kit'; -import { ConnectButton } from '@/components/ConnectWalletPopup/ConnectButton'; -import { Card } from '@massalabs/react-ui-kit/src/components/Card/Card'; -import useSchedule from '@/services/useSchedule'; -import useToken from '@/services/useToken'; -import ScheduleTable from '@/components/scheduleTable'; -import SelectAsset from '@/components/SelectAsset'; -import { InputLabel } from '@/components/InputLabel'; -import LogoSyntra from '../assets/logo-syntra.svg'; -import { arrowButton, commonButton } from '@/styles/buttons'; -import { parseUnits } from '@massalabs/massa-web3'; -import { FiInfo } from 'react-icons/fi'; -import { isValidAddress } from '../utils/address'; +import { useRef } from 'react'; +import useSchedule from '@/hooks/useSchedule'; +import ScheduleTable from '@/components/ScheduleTable'; import { useSearchParams } from 'react-router-dom'; -import { useTokenStore } from '../store/token'; - +import { ArrowButton } from '@/components/ArrowButton'; +import { ScheduleForm } from '@/components/ScheduleForm'; +import { NavBar } from '@/components/NavBar'; +// TODO: Add network and check if the user is connected to the right network +// TODO: Remove or fix event export default function HomePage() { - const { connectedAccount } = useAccountStore(); - const { scheduleInfo, setScheduleInfo, createSchedule, spenderSchedules } = - useSchedule(); - const { increaseAllowance } = useToken(); - const { tokens } = useTokenStore(); - + const { scheduleInfo, setScheduleInfo, spenderSchedules } = useSchedule(); const scheduleTableRef = useRef(null); - const [isVesting, setVesting] = useState(scheduleInfo.isVesting); - - const selectedToken = tokens.find( - (token) => token.address === scheduleInfo.asset.address, - ); - const isMasToken = scheduleInfo.asset.address === ''; const [searchParams] = useSearchParams(); const recipientQuery = searchParams.get('recipient'); + if (recipientQuery && scheduleInfo.recipient == '') { setScheduleInfo('recipient', recipientQuery); } - const isValidRecipient = isValidAddress(scheduleInfo.recipient); - - const balance = selectedToken?.balance ?? 0n; - const insufficientBalance = balance < scheduleInfo.amount; - - const disableAllowanceButton = - !isValidRecipient || - !connectedAccount || - scheduleInfo.amount === 0n || - !scheduleInfo.asset || - (selectedToken?.allowance ?? 0) >= - scheduleInfo.amount * scheduleInfo.occurrences || - insufficientBalance || - isMasToken; - - const disableCreateScheduleButton = - !isValidRecipient || - !connectedAccount || - !scheduleInfo.amount || - ((selectedToken?.allowance ?? 0) < - scheduleInfo.amount * scheduleInfo.occurrences && - !isMasToken); - const scrollToList = () => { if (scheduleTableRef.current) { scheduleTableRef.current.scrollIntoView({ behavior: 'smooth' }); } }; - const handleCreateSchedule = async () => { - try { - createSchedule(); - } catch (error) { - console.error(error); - toast.error('Failed to create schedule'); - } - }; - - const handleModeChange = (e: React.ChangeEvent) => { - const isChecked = e.target.checked; - const value = e.target.value; - - setScheduleInfo('amount', 0n); - if (isChecked) { - const isVesting = value === 'vesting'; - setVesting(isVesting); - setScheduleInfo('isVesting', isVesting); - } - }; - - const tipsModeDesc = `Once spending approval is given to the scheduler contract, - tokens are sent to the recipient address at the specified interval. - You are not required to old the total amount of tokens (amount * nbOccurences) in your wallet.`; - - const vestingModeDesc = `Using vesting mode will require to lock the total amount of tokens (amount * nbOccurences) - in the scheduler contract.`; - return ( - <> +
- - - {connectedAccount && ( -
-
- -
- -
- - -
-
-
-
- - { - setScheduleInfo( - 'amount', - parseUnits(amount, scheduleInfo.asset.decimals), - ); - }} - asset={scheduleInfo.asset} - value={ - formatAmount( - scheduleInfo.amount, - scheduleInfo.asset.decimals, - ).full - } - /> -
- -
- - -
-
- -
- - { - setScheduleInfo('recipient', address); - }} - /> -
- -
-
- { - setScheduleInfo('interval', BigInt(value)); - }} - /> -
- -
- - { - setScheduleInfo('occurrences', BigInt(value)); - }} - /> -
-
- -
- {!disableAllowanceButton && ( - - )} - - -
-
-
- -
- )} + +
+ + +
-
- {spenderSchedules.length > 0 ? ( - - ) : ( -
No schedules found
- )} +
- +
); } diff --git a/front/src/store/network.ts b/front/src/store/network.ts new file mode 100644 index 0000000..3c49e8d --- /dev/null +++ b/front/src/store/network.ts @@ -0,0 +1,28 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { create } from 'zustand'; + +type AvailableNetwork = 'mainnet' | 'buildnet'; + +export interface NetworkStoreState { + network: AvailableNetwork; + isMainnet: boolean; + setNetwork: (network: AvailableNetwork) => void; + toggleNetwork: () => void; +} + +export const useNetworkStore = create((set) => ({ + network: 'buildnet', + isMainnet: false, + + setNetwork: (network: AvailableNetwork) => { + set({ network, isMainnet: network === 'mainnet' }); + }, + + toggleNetwork: () => { + set((state) => ({ + network: state.network === 'mainnet' ? 'buildnet' : 'mainnet', + isMainnet: !state.isMainnet, + })); + }, +})); diff --git a/front/src/store/scheduler.ts b/front/src/store/scheduler.ts index 8237234..48feec0 100644 --- a/front/src/store/scheduler.ts +++ b/front/src/store/scheduler.ts @@ -3,7 +3,7 @@ import { Args, Slot } from '@massalabs/massa-web3'; import { Asset } from '@massalabs/react-ui-kit/src/lib/token/models/AssetModel'; import { Schedule } from '@/serializable/Schedule'; -import { supportedTokens } from '@/const/assets'; +import { MasToken } from '@/const/assets'; import { useAccountStore } from '@massalabs/react-ui-kit'; export type ScheduleInfo = { @@ -44,7 +44,7 @@ const defaultScheduleInfo: ScheduleInfo = { interval: 5400n, recipient: '', spender: '', - asset: supportedTokens[0], + asset: MasToken, occurrences: 4n, tolerance: 3n, }; diff --git a/front/src/store/store.ts b/front/src/store/store.ts index b2fe025..d9420d1 100644 --- a/front/src/store/store.ts +++ b/front/src/store/store.ts @@ -1,36 +1,41 @@ -import { formatAmount, toast, useAccountStore } from '@massalabs/react-ui-kit'; -import { useTokenStore } from './token'; -import { useSchedulerStore } from './scheduler'; -import { EventPoller, Provider } from '@massalabs/massa-web3'; +import { EventPoller, Provider, SCEvent } from '@massalabs/massa-web3'; import { schedulerAddress } from '../const/contracts'; import { Schedule } from '../serializable/Schedule'; +import { truncateAddress } from '@/utils/address'; +import { useAccountStore, formatAmount, toast } from '@massalabs/react-ui-kit'; +import { useSchedulerStore } from './scheduler'; +import { useTokenStore } from './token'; +import { getTokenInfo } from '@/utils/assets'; +import { useNetworkStore } from './network'; export async function initApp() { const { connectedAccount } = useAccountStore.getState(); - if (!connectedAccount) { - return; - } - initTokens(); - initSchedules(connectedAccount); - initPollEvent(connectedAccount); + if (!connectedAccount) return; + + await initTokens(); + await initSchedules(connectedAccount); + await initPollEvent(connectedAccount); } -export async function initTokens() { - const { refreshBalances } = useTokenStore.getState(); - refreshBalances(); +async function initTokens() { + const { init } = useTokenStore.getState(); + await init(); +} + +async function initSchedules(connectedAccount: Provider) { + const { tokens } = useTokenStore.getState(); + const { setSchedulerAddress, getBySpender, scheduleInfo, setScheduleInfo } = + useSchedulerStore.getState(); + const { network } = useNetworkStore.getState(); + setSchedulerAddress(schedulerAddress[network]); + + scheduleInfo.asset = tokens[0]; + setScheduleInfo('asset', tokens[0]); + + await getBySpender(connectedAccount.address); } -export const initSchedules = async (connectedAccount: Provider) => { - useSchedulerStore - .getState() - // Todo fix chain id never initialized in ui-kit - .setSchedulerAddress(schedulerAddress); - useSchedulerStore.getState().getBySpender(connectedAccount.address); -}; - -// Todo - For now this will poll every transfer. We need to filter by spender -// Except if we want to showcase all transfers and make nice animation on each transfer -export const initPollEvent = async (connectedAccount: Provider) => { +async function initPollEvent(connectedAccount: Provider) { const { getBySpender, address: schedulerAddress, @@ -40,38 +45,45 @@ export const initPollEvent = async (connectedAccount: Provider) => { if (eventPollerStop) eventPollerStop(); - const { refreshBalances } = useTokenStore.getState(); const { lastSlot } = await connectedAccount.getNodeStatus(); const { stopPolling } = EventPoller.start( connectedAccount, - { - smartContractAddress: schedulerAddress, - start: lastSlot, - }, - (data) => { - getBySpender(connectedAccount.address).then((schedules: Schedule[]) => { - if (schedules?.length) { - for (const event of data) { - const match = event.data?.match(/Transfer:([^]+)/); - if (match) { - const info = event.data.split(','); - const id = info[0].split(':')[1]; - const schedule = schedules.find((s) => s.id === BigInt(id)); - if (schedule) { - toast.success( - `Transfer: ${schedule.recipient} received ${ - formatAmount(schedule.amount).preview - } MAS`, - ); - refreshBalances(); - } - } - } - } - }); + { smartContractAddress: schedulerAddress, start: lastSlot }, + async (data) => { + const schedules = await getBySpender(connectedAccount.address); + if (!schedules?.length) return; + + handleTransferEvents(data, schedules); }, ); setEventPollerStop(stopPolling); -}; +} + +function handleTransferEvents(data: SCEvent[], schedules: Schedule[]) { + const { refreshBalances } = useTokenStore.getState(); + const { tokens } = useTokenStore.getState(); + + for (const event of data) { + const match = event.data?.match(/Transfer:([^]+)/); + if (!match) continue; + + const [id] = event.data.split(','); + const scheduleId = id.split(':')[1]; + const schedule = schedules.find((s) => s.id === BigInt(scheduleId)); + + if (schedule) { + const { decimals, symbol } = getTokenInfo(schedule.tokenAddress, tokens); + const formattedAmount = formatAmount(schedule.amount, decimals).preview; + + toast.success( + `Transfer: ${truncateAddress( + schedule.recipient, + )} received ${formattedAmount} ${symbol}`, + ); + + refreshBalances(); + } + } +} diff --git a/front/src/store/token.ts b/front/src/store/token.ts index eef172e..ac1e052 100644 --- a/front/src/store/token.ts +++ b/front/src/store/token.ts @@ -6,18 +6,27 @@ import { MRC20 } from '@massalabs/massa-web3'; import { MasToken, supportedTokens } from '@/const/assets'; import { Asset } from '@massalabs/react-ui-kit/src/lib/token/models/AssetModel'; import { useSchedulerStore } from './scheduler'; +import { useNetworkStore } from './network'; export interface TokenStoreState { selectedToken?: Asset; tokens: Asset[]; mas: Asset; + init: () => void; refreshBalances: () => void; } export const useTokenStore = create((set, get) => ({ - tokens: supportedTokens, + tokens: [], mas: MasToken, + init: async () => { + const { network } = useNetworkStore.getState(); + set({ tokens: supportedTokens[network] }); + const { refreshBalances } = get(); + refreshBalances(); + }, + refreshBalances: async () => { const { connectedAccount } = useAccountStore.getState(); @@ -31,14 +40,14 @@ export const useTokenStore = create((set, get) => ({ return; } - const { tokens: supportedTokens, mas } = get(); + const { tokens: sTokens, mas } = get(); - if (!supportedTokens.length) { + if (!sTokens.length) { return; } const tokens = await Promise.all( - supportedTokens.map(async (token) => { + sTokens.map(async (token) => { const mrc20 = new MRC20(connectedAccount, token.address); const [allowance, balance] = await Promise.all([ mrc20.allowance(connectedAccount.address, schedulerAddress), diff --git a/front/src/styles/buttons.ts b/front/src/styles/buttons.ts index 21932c1..fca98a6 100644 --- a/front/src/styles/buttons.ts +++ b/front/src/styles/buttons.ts @@ -1,20 +1,3 @@ -export const commonButton = [ - 'hover:bg-opacity-80 hover:shadow-md', - 'active:shadow-none', - 'transition-all duration-50 ease-in-out', - 'disabled:opacity-50 disabled:cursor-not-allowed', -]; - -export const arrowButton = [ - 'p-2', - 'rounded-full', - 'bg-white', - 'hover:bg-gray-200', - 'text-primary', - 'hover:ring-1', - 'ring-primary', - 'transition-all', - 'duration-100', - 'ease-in-out', - 'active:translate-y-1', -]; +/* eslint-disable max-len */ +export const commonButton = + 'hover:bg-opacity-80 hover:shadow-md active:shadow-none transition-all duration-50 ease-in-out disabled:opacity-50 disabled:cursor-not-allowed'; diff --git a/front/src/utils/assets.ts b/front/src/utils/assets.ts new file mode 100644 index 0000000..e59e78c --- /dev/null +++ b/front/src/utils/assets.ts @@ -0,0 +1,22 @@ +import { MasToken } from '@/const/assets'; +import { Asset } from '@massalabs/react-ui-kit/src/lib/token/models/AssetModel'; + +export function getTokenInfo(tokenAddress: string | null, tokens: Asset[]) { + if (!tokenAddress) return MasToken; + + const token = tokens.find((t) => t.address === tokenAddress); + + if (!token) { + return { + name: 'Unknown', + address: tokenAddress, + symbol: 'Unknown', + decimals: 18, + balance: 0n, + allowance: 0n, + chainId: 0, + }; + } + + return token; +} diff --git a/front/tailwind.config.js b/front/tailwind.config.js index c40b32a..82bb640 100644 --- a/front/tailwind.config.js +++ b/front/tailwind.config.js @@ -5,6 +5,13 @@ export default { './src/**/*.{js,ts,jsx,tsx}', './node_modules/@massalabs/react-ui-kit/src/**/*.{js,ts,jsx,tsx}', ], + theme: { + extend: { + fontFamily: { + caveat: ['Caveat', 'cursive'], + }, + }, + }, presets: [require('./src/themes/default.js')], plugins: [require('@tailwindcss/forms')], };