diff --git a/package-lock.json b/package-lock.json index 9720ae48..111ad18b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "data-dex", - "version": "1.11.0", + "version": "1.11.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "data-dex", - "version": "1.11.0", + "version": "1.11.4", "dependencies": { "@chakra-ui/icons": "2.1.1", "@chakra-ui/react": "2.8.2", "@emotion/react": "11.11.3", "@emotion/styled": "11.11.0", "@hookform/resolvers": "3.3.4", - "@itheum/sdk-mx-data-nft": "2.6.2", + "@itheum/sdk-mx-data-nft": "2.7.0-alpha.2", "@itheum/sdk-mx-enterprise": "0.2.0", "@multiversx/sdk-core": "12.18.0", "@multiversx/sdk-dapp": "2.28.0", @@ -4151,9 +4151,9 @@ } }, "node_modules/@itheum/sdk-mx-data-nft": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@itheum/sdk-mx-data-nft/-/sdk-mx-data-nft-2.6.2.tgz", - "integrity": "sha512-kgfD6IQZV01PmA5/eBjM1vRPsZHm8jEzQD1JwNy6GNygCxGpmkDsQNYOW7PpeiTdGLE4Bq4bbkUaS6/z1XkTuA==", + "version": "2.7.0-alpha.2", + "resolved": "https://registry.npmjs.org/@itheum/sdk-mx-data-nft/-/sdk-mx-data-nft-2.7.0-alpha.2.tgz", + "integrity": "sha512-jORhgT0Pv/ha77D/oM9BAim36dqsh9XMK0a07kC1I0HnKSn/RDEUFsRAEOA5vABShlxbW2jN5uTaHOGm9A9txw==", "dependencies": { "@multiversx/sdk-core": "12.18.0", "@multiversx/sdk-network-providers": "2.2.1", @@ -4332,9 +4332,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -4404,11 +4404,11 @@ } }, "node_modules/@ledgerhq/hw-transport-web-ble/node_modules/@ledgerhq/devices": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.2.0.tgz", - "integrity": "sha512-XROTW2gTmmuy+YPPDjdtKKTQ3mfxrPtKtV+a9QFbj8f5MnjVMV0Zpy1BIB4CyIMsVVi4z6+nI67auT7IlsM3SQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.2.1.tgz", + "integrity": "sha512-l/2I/Xzt7Z32OmGzoc/mUvaZivdn7Id/SO7hBTGpk7PtJTpBRxVAabP4GWEKCayGyOAcvTwoVxM0HMkNVfIzOQ==", "dependencies": { - "@ledgerhq/errors": "^6.16.1", + "@ledgerhq/errors": "^6.16.2", "@ledgerhq/logs": "^6.12.0", "rxjs": "^7.8.1", "semver": "^7.3.5" @@ -4423,17 +4423,17 @@ } }, "node_modules/@ledgerhq/hw-transport-web-ble/node_modules/@ledgerhq/errors": { - "version": "6.16.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.16.1.tgz", - "integrity": "sha512-4D4wKecGzQpIu7sx03Sg4uE1e8g1oZUndWgw9gw776H8h9ov9c5TxPaldTn2j6orPECAERViLf7LTO4L5pE2Cw==" + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.16.2.tgz", + "integrity": "sha512-jFpohaSW+p1Obp3NDT9QSByEtT3gtBZIjVNu8m25gnrH5zdtfPVlPwH6UiuS50s+2dHQyehV8hF+IfreKDWAZA==" }, "node_modules/@ledgerhq/hw-transport-web-ble/node_modules/@ledgerhq/hw-transport": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.30.3.tgz", - "integrity": "sha512-eqtTCGy8wFCxl+hZSEpjVqn1EDjQhFCne/qUyY0aA36efhWUF6bCRAhkq1e5i7g2P6TbxcIM5P5PW67dILuqIQ==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.30.4.tgz", + "integrity": "sha512-VBcVd7UG8HDrjWMoZI5rqBDz+PBxLHTIPZOGY/fdMoEUwaBbss0Z3MxuJanMyerlfaLqnBSVuL0blz7rOyagkw==", "dependencies": { - "@ledgerhq/devices": "^8.2.0", - "@ledgerhq/errors": "^6.16.1", + "@ledgerhq/devices": "^8.2.1", + "@ledgerhq/errors": "^6.16.2", "@ledgerhq/logs": "^6.12.0", "events": "^3.3.0" } @@ -5255,9 +5255,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", "cpu": [ "arm" ], @@ -5268,9 +5268,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", "cpu": [ "arm64" ], @@ -5281,9 +5281,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", "cpu": [ "arm64" ], @@ -5294,9 +5294,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", "cpu": [ "x64" ], @@ -5307,9 +5307,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", "cpu": [ "arm" ], @@ -5320,9 +5320,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", "cpu": [ "arm64" ], @@ -5333,9 +5333,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", "cpu": [ "arm64" ], @@ -5346,9 +5346,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", "cpu": [ "riscv64" ], @@ -5359,9 +5359,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", "cpu": [ "x64" ], @@ -5372,9 +5372,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", "cpu": [ "x64" ], @@ -5385,9 +5385,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", "cpu": [ "arm64" ], @@ -5398,9 +5398,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", "cpu": [ "ia32" ], @@ -5411,9 +5411,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", "cpu": [ "x64" ], @@ -6197,9 +6197,9 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -7240,16 +7240,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7406,9 +7406,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -7784,9 +7787,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -7803,8 +7806,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -7883,13 +7886,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7928,9 +7936,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001584", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", - "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", "dev": true, "funding": [ { @@ -8018,15 +8026,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8039,6 +8041,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -8078,9 +8083,9 @@ } }, "node_modules/citty": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz", - "integrity": "sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dependencies": { "consola": "^3.2.3" } @@ -8210,12 +8215,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.22.3" }, "funding": { "type": "opencollective", @@ -8469,16 +8474,19 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -8539,9 +8547,9 @@ } }, "node_modules/destr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz", - "integrity": "sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" }, "node_modules/detect-browser": { "version": "5.3.0", @@ -8709,9 +8717,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.656", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", - "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", + "version": "1.4.679", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.679.tgz", + "integrity": "sha512-NhQMsz5k0d6m9z3qAxnsOR/ebal4NAGsrNVRwcDo4Kc/zQ7KdsTKZUxZoygHcVRb0QDW3waEDIcE3isZ79RP6g==", "dev": true }, "node_modules/elliptic": { @@ -8842,50 +8850,52 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", + "typed-array-buffer": "^1.0.1", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8900,6 +8910,17 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -8909,36 +8930,40 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -9009,9 +9034,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -10349,9 +10374,9 @@ } }, "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -10424,15 +10449,15 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/focus-lock": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.0.0.tgz", - "integrity": "sha512-a8Ge6cdKh9za/GZR/qtigTAk7SrGore56EFcoMshClsh7FLk1zwszc/ltuMfKhx56qeuyL/jWQ4J4axou0iJ9w==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.3.tgz", + "integrity": "sha512-hfXkZha7Xt4RQtrL1HBfspAuIj89Y0fb6GX0dfJilb8S2G/lvL4akPAcHq6xoD2NuZnDMCnZL/zQesMyeu6Psg==", "dependencies": { "tslib": "^2.0.3" }, @@ -10622,11 +10647,11 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", - "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "es-errors": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -10669,13 +10694,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -10820,9 +10846,9 @@ "dev": true }, "node_modules/h3": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.10.1.tgz", - "integrity": "sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.10.2.tgz", + "integrity": "sha512-r1iNNcFGL4G9pL3lgYxwX0O2ZmqdKqhILAJsnlw5icn5I1QHnADM4TgVdYRtHUqy+NntVpHIEFwnw/XCbebICg==", "dependencies": { "cookie-es": "^1.0.0", "defu": "^6.1.4", @@ -10874,20 +10900,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -10944,9 +10970,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -11019,9 +11045,9 @@ "dev": true }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -11047,9 +11073,9 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -11191,12 +11217,12 @@ "integrity": "sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -11731,9 +11757,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -11814,12 +11840,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12047,9 +12076,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -12916,9 +12945,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", - "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -13170,9 +13199,9 @@ } }, "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.0.tgz", + "integrity": "sha512-YOvg9hfYQmnaB56Yb+KrJE2u0Yzz5zR+sLejEvF4fzwzV1Al6hkf2vyHTwqCRyv0hCi9rVCqVoXpyYevQIRwLQ==", "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", @@ -13370,9 +13399,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.1.tgz", - "integrity": "sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", + "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==" }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", @@ -14021,10 +14050,18 @@ "node": ">=10.13.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -14388,12 +14425,12 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-focus-lock": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.7.tgz", - "integrity": "sha512-EfhX040SELLqnQ9JftqsmQCG49iByg8F5X5m19Er+n371OaETZ35dlNPZrLOOTlnnwD4c2Zv0KDgabDTc7dPHw==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.1.tgz", + "integrity": "sha512-IXLwnTBrLTlKTpASZXqqXJ8oymWrgAlOfuuDYN4XCuN1YJ72dwX198UCaF1QqGUk5C3QOnlMik//n3ufcfe8Ig==", "dependencies": { "@babel/runtime": "^7.0.0", - "focus-lock": "^1.0.0", + "focus-lock": "^1.3.2", "prop-types": "^15.6.2", "react-clientside-effect": "^1.2.6", "use-callback-ref": "^1.3.0", @@ -14532,9 +14569,9 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.5.tgz", + "integrity": "sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -14897,14 +14934,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "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==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -15072,9 +15110,9 @@ } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -15087,19 +15125,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", "fsevents": "~2.3.2" } }, @@ -15181,13 +15219,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -15236,9 +15274,9 @@ "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -15272,13 +15310,14 @@ "optional": true }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" }, @@ -15287,14 +15326,15 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15369,13 +15409,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15488,9 +15532,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", @@ -15502,9 +15546,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" }, "node_modules/split-on-first": { "version": "1.1.0", @@ -15969,9 +16013,9 @@ } }, "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "engines": { "node": ">=14.0.0" @@ -16042,12 +16086,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -16161,29 +16205,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16193,16 +16238,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16212,14 +16258,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16239,9 +16291,9 @@ } }, "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==" }, "node_modules/uint8arrays": { "version": "3.1.1", @@ -16869,9 +16921,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "engines": { "node": ">= 8" } diff --git a/package.json b/package.json index 02d973d9..dfd8df51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "data-dex", - "version": "1.11.0", + "version": "1.11.4", "description": "The Itheum Data DEX enables you to trade your data using web3 tech", "dependencies": { "@chakra-ui/icons": "2.1.1", @@ -8,7 +8,7 @@ "@emotion/react": "11.11.3", "@emotion/styled": "11.11.0", "@hookform/resolvers": "3.3.4", - "@itheum/sdk-mx-data-nft": "2.6.2", + "@itheum/sdk-mx-data-nft": "2.7.0-alpha.2", "@itheum/sdk-mx-enterprise": "0.2.0", "@multiversx/sdk-core": "12.18.0", "@multiversx/sdk-dapp": "2.28.0", diff --git a/src/assets/img/whitelist/NFTuneApp.png b/src/assets/img/whitelist/NFTuneApp.png new file mode 100644 index 00000000..a45d9049 Binary files /dev/null and b/src/assets/img/whitelist/NFTuneApp.png differ diff --git a/src/assets/img/whitelist/TimeCapsuleApp.png b/src/assets/img/whitelist/TimeCapsuleApp.png new file mode 100644 index 00000000..e27a9ab7 Binary files /dev/null and b/src/assets/img/whitelist/TimeCapsuleApp.png differ diff --git a/src/components/ListDataNFTModal.tsx b/src/components/ListDataNFTModal.tsx index 0e2b3b4c..c283b388 100644 --- a/src/components/ListDataNFTModal.tsx +++ b/src/components/ListDataNFTModal.tsx @@ -15,6 +15,7 @@ import { useToast, useColorMode, } from "@chakra-ui/react"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; import { useGetAccountInfo, useGetLoginInfo, useGetNetworkConfig, useGetPendingTransactions, useTrackTransactionStatus } from "@multiversx/sdk-dapp/hooks"; import axios from "axios"; @@ -22,7 +23,8 @@ import BigNumber from "bignumber.js"; import DataNFTLiveUptime from "components/UtilComps/DataNFTLiveUptime"; import { contractsForChain } from "libs/config"; import { getApi } from "libs/MultiversX/api"; -import { sleep, printPrice, convertToLocalString, getTokenWantedRepresentation, backendApi } from "libs/utils"; +import { DataNftMarketContract } from "libs/MultiversX/dataNftMarket"; +import { sleep, printPrice, convertToLocalString, getTokenWantedRepresentation, backendApi, getApiDataMarshal } from "libs/utils"; import { useMarketStore } from "store"; export type ListModalProps = { @@ -30,8 +32,8 @@ export type ListModalProps = { onClose: () => void; sellerFee: number; nftData: any; - offer: any; - marketContract: any; + offer: Partial; + marketContract: DataNftMarketContract; amount: number; setAmount: (amount: number) => void; }; @@ -40,16 +42,15 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, const { chainID } = useGetNetworkConfig(); const { address } = useGetAccountInfo(); const marketRequirements = useMarketStore((state) => state.marketRequirements); - const toast = useToast(); - const fullPrice = amount * offer.wanted_token_amount; + const fullPrice = amount * Number(offer.wantedTokenAmount); const priceWithSellerFee = fullPrice - (fullPrice * sellerFee) / 10000; const priceWithSellerFeeAndRoyalties = priceWithSellerFee - priceWithSellerFee * nftData.royalties; const feePrice = address !== nftData.creator - ? printPrice(priceWithSellerFeeAndRoyalties, getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)) - : printPrice(priceWithSellerFee, getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)); - const fee = offer.wanted_token_amount; + ? printPrice(priceWithSellerFeeAndRoyalties, getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)) + : printPrice(priceWithSellerFee, getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)); + const fee = offer.wantedTokenAmount; const [readTermsChecked, setReadTermsChecked] = useState(false); const [liveUptimeFAIL, setLiveUptimeFAIL] = useState(true); const [isLiveUptimeSuccessful, setIsLiveUptimeSuccessful] = useState(false); @@ -92,15 +93,15 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, async function addOfferBackend( txHash = listTxHash, - offered_token_identifier = nftData.collection, - offered_token_nonce = nftData.nonce, - offered_token_amount = 1, + offeredTokenIdentifier = nftData.collection, + offeredTokenNonce = nftData.nonce, + offeredTokenAmount = 1, title = nftData.title, description = nftData.description, - wanted_token_identifier = offer.wanted_token_identifier, - wanted_token_nonce = offer.wanted_token_nonce, - wanted_token_amount = Number( - (Number(offer.wanted_token_amount) + (Number(offer.wanted_token_amount) * (marketRequirements.buyerTaxPercentage ?? 200)) / 10000) * Number(10 ** 18) + wantedTokenIdentifier = offer.wantedTokenIdentifier, + wantedTokenNonce = offer.wantedTokenNonce, + wantedTokenAmount = Number( + (Number(offer.wantedTokenAmount) + (Number(offer.wantedTokenAmount) * (marketRequirements.buyerTaxPercentage ?? 200)) / 10000) * Number(10 ** 18) ).toString(), quantity = amount * 1, owner = address @@ -135,17 +136,17 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, }; const requestBody = { - index: index, - offered_token_identifier: offered_token_identifier, - offered_token_nonce: offered_token_nonce, - offered_token_amount: offered_token_amount, - title: title, - description: description, - wanted_token_identifier: wanted_token_identifier, - wanted_token_nonce: wanted_token_nonce, - wanted_token_amount: wanted_token_amount, - quantity: quantity, - owner: owner, + index, + offeredTokenIdentifier, + offeredTokenNonce, + offeredTokenAmount, + title, + description, + wantedTokenIdentifier, + wantedTokenNonce, + wantedTokenAmount, + quantity, + owner, }; const response = await fetch(`${backendUrl}/addOffer`, { @@ -196,21 +197,21 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, } } - const { sessionId } = await marketContract.addToMarket(nftData.collection, nftData.nonce, amount, offer.wanted_token_amount, address); + const { sessionId } = await marketContract.addToMarket(nftData.collection, nftData.nonce, amount, offer.wantedTokenAmount ?? 0, address); if (isWebWallet) { - const price = Number(offer.wanted_token_amount) + (Number(offer.wanted_token_amount) * (marketRequirements.buyerTaxPercentage ?? 200)) / 10000; + const price = Number(offer.wantedTokenAmount) + (Number(offer.wantedTokenAmount) * (marketRequirements.buyerTaxPercentage ?? 200)) / 10000; sessionStorage.setItem( "web-wallet-tx", JSON.stringify({ type: "add-offer-tx", - offered_token_identifier: nftData.collection, - offered_token_nonce: nftData.nonce, - offered_token_amount: 1, + offeredTokenIdentifier: nftData.collection, + offeredTokenNonce: nftData.nonce, + offeredTokenAmount: 1, title: nftData.title, description: nftData.description, - wanted_token_identifier: offer.wanted_token_identifier, - wanted_token_nonce: offer.wanted_token_nonce, - wanted_token_amount: Number(price * Number(10 ** 18)).toString(), + wantedTokenIdentifier: offer.wantedTokenIdentifier, + wantedTokenNonce: offer.wantedTokenNonce, + wantedTokenAmount: Number(price * Number(10 ** 18)).toString(), quantity: amount * 1, owner: address, }) @@ -263,8 +264,8 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, <> {": "} {printPrice( - new BigNumber(offer.wanted_token_amount).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + new BigNumber(offer.wantedTokenAmount ?? 0).toNumber(), + getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0) )} ) : ( @@ -277,10 +278,10 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, Seller Tax (per NFT) :{" "} - {`${sellerFee / 100}% (${new BigNumber(offer.wanted_token_amount) + {`${sellerFee / 100}% (${new BigNumber(offer.wantedTokenAmount ?? 0) .multipliedBy(sellerFee) .div(10000) - .toNumber()} ${getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)})`} + .toNumber()} ${getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)})`} @@ -290,8 +291,8 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, :{" "} {`${convertToLocalString(nftData.royalties * 100)}% (${convertToLocalString( - new BigNumber(offer.wanted_token_amount).multipliedBy((1 - sellerFee / 10000) * nftData.royalties) - )} ${getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)})`} + new BigNumber(offer.wantedTokenAmount ?? 0).multipliedBy((1 - sellerFee / 10000) * nftData.royalties) + )} ${getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)})`} )} @@ -302,7 +303,7 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, {": "} { <> - {feePrice} {fee && itheumPrice ? `(~${convertToLocalString(fee * itheumPrice * amount, 2)} USD)` : ""} + {feePrice} {fee && itheumPrice ? `(~${convertToLocalString(Number(fee) * itheumPrice * amount, 2)} USD)` : ""} } @@ -312,20 +313,20 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, { <> - {new BigNumber(offer.wanted_token_amount).comparedTo(0) <= 0 ? ( + {new BigNumber(offer.wantedTokenAmount ?? 0).comparedTo(0) <= 0 ? ( "" ) : ( <> - {" " + convertToLocalString(new BigNumber(offer.wanted_token_amount).multipliedBy(amount)) + " "} - {getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)} + {" " + convertToLocalString(new BigNumber(offer.wantedTokenAmount ?? 0).multipliedBy(amount)) + " "} + {getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)} {" - "} - {convertToLocalString(new BigNumber(offer.wanted_token_amount).multipliedBy(amount).multipliedBy(sellerFee).div(10000))} - {" " + getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)} + {convertToLocalString(new BigNumber(offer.wantedTokenAmount ?? 0).multipliedBy(amount).multipliedBy(sellerFee).div(10000))} + {" " + getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)} {address != nftData.creator && ( <> {" - "} - {convertToLocalString(new BigNumber(offer.wanted_token_amount).multipliedBy((1 - sellerFee / 10000) * nftData.royalties))} - {" " + getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)} + {convertToLocalString(new BigNumber(offer.wantedTokenAmount ?? 0).multipliedBy((1 - sellerFee / 10000) * nftData.royalties))} + {" " + getTokenWantedRepresentation(offer.wantedTokenIdentifier ?? "", offer.wantedTokenNonce ?? 0)} )} @@ -337,7 +338,7 @@ export default function ListDataNFTModal({ isOpen, onClose, sellerFee, nftData, setLiveUptimeFAIL(hasFailed)} isLiveUptimeSuccessful={isLiveUptimeSuccessful} diff --git a/src/components/MarketplaceLowerCard.tsx b/src/components/MarketplaceLowerCard.tsx index 507040f8..5d48ba55 100644 --- a/src/components/MarketplaceLowerCard.tsx +++ b/src/components/MarketplaceLowerCard.tsx @@ -12,17 +12,18 @@ import { Flex, Box, } from "@chakra-ui/react"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; import { useGetAccountInfo, useGetLoginInfo } from "@multiversx/sdk-dapp/hooks/account"; import { useGetPendingTransactions } from "@multiversx/sdk-dapp/hooks/transactions"; import ProcureDataNFTModal from "components/ProcureDataNFTModal"; import ExploreAppButton from "components/UtilComps/ExploreAppButton"; -import { DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftMetadataType } from "libs/MultiversX/types"; import { isValidNumericCharacter } from "libs/utils"; import { useMarketStore } from "store"; import PreviewDataButton from "./PreviewDataButton"; type MarketplaceLowerCardProps = { - offer: OfferType; + offer: Offer; nftMetadata: DataNftMetadataType; }; @@ -31,28 +32,28 @@ const MarketplaceLowerCard: FC = ({ offer, nftMetadat const { address } = useGetAccountInfo(); const { hasPendingTransactions } = useGetPendingTransactions(); const marketRequirements = useMarketStore((state) => state.marketRequirements); - const [amount, setAmount] = useState(1); const [amountError, setAmountError] = useState(""); const { isOpen: isProcureModalOpen, onOpen: onProcureModalOpen, onClose: onProcureModalClose } = useDisclosure(); const isMyNft = offer.owner === address; const maxBuyLimit = import.meta.env.VITE_MAX_BUY_LIMIT_PER_SFT ? Number(import.meta.env.VITE_MAX_BUY_LIMIT_PER_SFT) : 0; const maxBuyNumber = maxBuyLimit > 0 ? Math.min(maxBuyLimit, offer.quantity) : offer.quantity; + return ( <> - + {!isMyNft ? ( isMxLoggedIn && ( - + - Amount{" "} + Quantity{" "} = ({ offer, nftMetadat onClick={() => { onProcureModalOpen(); }}> - Purchase Data + Buy Data NFT diff --git a/src/components/MyListedDataLowerCard.tsx b/src/components/MyListedDataLowerCard.tsx index f2503f10..c86b81a1 100644 --- a/src/components/MyListedDataLowerCard.tsx +++ b/src/components/MyListedDataLowerCard.tsx @@ -26,7 +26,7 @@ import BigNumber from "bignumber.js"; import { PREVIEW_DATA_ON_DEVNET_SESSION_KEY, contractsForChain } from "libs/config"; import { useLocalStorage } from "libs/hooks"; import { DataNftMarketContract } from "libs/MultiversX/dataNftMarket"; -import { DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftMetadataType } from "libs/MultiversX/types"; import { convertToLocalString, convertEsdtToWei, @@ -39,9 +39,10 @@ import { } from "libs/utils"; import { useMarketStore } from "store"; import PreviewDataButton from "./PreviewDataButton"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; type MyListedDataLowerCardProps = { - offer: OfferType; + offer: Offer; nftMetadata: DataNftMetadataType; }; @@ -134,7 +135,7 @@ const MyListedDataLowerCard: FC = ({ offer, nftMetad const price = newPrice + (newPrice * (marketRequirements.buyerTaxPercentage ?? 200)) / 10000; - const requestBody = { price: convertEsdtToWei(price, tokenDecimals(offer.wanted_token_identifier)).toFixed() }; + const requestBody = { price: convertEsdtToWei(price, tokenDecimals(offer.wantedTokenIdentifier)).toFixed() }; const response = await fetch(`${backendUrl}/updateOffer/${index}`, { method: "POST", headers: headers, @@ -182,8 +183,8 @@ const MyListedDataLowerCard: FC = ({ offer, nftMetad const fee = marketRequirements && offer ? convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount).multipliedBy(10000).div(10000 + (marketRequirements.buyerTaxPercentage as number)), - tokenDecimals(offer.wanted_token_identifier) + new BigNumber(offer.wantedTokenAmount).multipliedBy(10000).div(10000 + (marketRequirements.buyerTaxPercentage as number)), + tokenDecimals(offer.wantedTokenIdentifier) ).toNumber() : 0; @@ -247,7 +248,7 @@ const MyListedDataLowerCard: FC = ({ offer, nftMetad const { sessionId: sessionIdTemp } = await contract.updateOfferPrice( offer.index, - convertEsdtToWei(newListingPrice, tokenDecimals(offer.wanted_token_identifier)).toFixed(), + convertEsdtToWei(newListingPrice, tokenDecimals(offer.wantedTokenIdentifier)).toFixed(), address ); if (isWebWallet) { @@ -287,8 +288,8 @@ const MyListedDataLowerCard: FC = ({ offer, nftMetad if (marketRequirements) { setNewListingPrice( convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount).multipliedBy(10000).div(10000 + marketRequirements.buyerTaxPercentage), - tokenDecimals(offer.wanted_token_identifier) + new BigNumber(offer.wantedTokenAmount).multipliedBy(10000).div(10000 + marketRequirements.buyerTaxPercentage), + tokenDecimals(offer.wantedTokenIdentifier) ).toNumber() ); } else { @@ -452,7 +453,7 @@ const MyListedDataLowerCard: FC = ({ offer, nftMetad Current Fee per Data NFT - : {fee} {getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)}{" "} + : {fee} {getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce)}{" "} {fee && itheumPrice ? `(~${convertToLocalString(fee * itheumPrice, 2)} USD)` : ""} diff --git a/src/components/MyListedDataNFT.tsx b/src/components/MyListedDataNFT.tsx index 4dcce605..8f9020c9 100644 --- a/src/components/MyListedDataNFT.tsx +++ b/src/components/MyListedDataNFT.tsx @@ -17,6 +17,7 @@ import { Skeleton, Text, } from "@chakra-ui/react"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; import { useGetNetworkConfig } from "@multiversx/sdk-dapp/hooks"; import { useGetAccountInfo } from "@multiversx/sdk-dapp/hooks/account"; import { useGetPendingTransactions } from "@multiversx/sdk-dapp/hooks/transactions"; @@ -25,15 +26,15 @@ import moment from "moment/moment"; import ShortAddress from "components/UtilComps/ShortAddress"; import { CHAIN_TX_VIEWER, uxConfig } from "libs/config"; import { getApi } from "libs/MultiversX/api"; -import { DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftMetadataType } from "libs/MultiversX/types"; import { convertWeiToEsdt, convertToLocalString, getTokenWantedRepresentation, hexZero, tokenDecimals } from "libs/utils"; import { useMarketStore, useMintStore } from "store"; import FrozenOverlay from "./FrozenOverlay"; import PreviewDataButton from "./PreviewDataButton"; type MyListedDataNFTProps = { - offer: OfferType; - offers: Record; + offer: Offer; + offers: Record; nftImageLoading: boolean; setNftImageLoading: Dispatch>; nftMetadataLoading: boolean; @@ -81,7 +82,7 @@ const MyListedDataNFT: FC = (props) => { {"item.dataPreview"} = (props) => { {address && address == nftMetadata[index].creator && ( - You are the Creator + You Created this )} {address && address == offer.owner && ( - You are Owner + You Own this )} @@ -174,10 +175,10 @@ const MyListedDataNFT: FC = (props) => { <> - Unlock from: {` `} + Get from: {` `} {printPrice( - convertWeiToEsdt(offer.wanted_token_amount, tokenDecimals(offer.wanted_token_identifier)).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + convertWeiToEsdt(offer.wantedTokenAmount, tokenDecimals(offer.wantedTokenIdentifier)).toNumber(), + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce) )} @@ -225,11 +226,11 @@ const MyListedDataNFT: FC = (props) => { if (marketRequirements) { setNewListingPrice( convertWeiToEsdt( - new BigNumber(offers[index].wanted_token_amount) + new BigNumber(offers[index].wantedTokenAmount) .multipliedBy(amountOfTokens[index]) .multipliedBy(10000) .div(10000 + marketRequirements.buyerTaxPercentage), - tokenDecimals(offers[index].wanted_token_identifier) + tokenDecimals(offers[index].wantedTokenIdentifier) ).toNumber() ); } else { @@ -247,7 +248,7 @@ const MyListedDataNFT: FC = (props) => { diff --git a/src/components/ProcureDataNFTModal.tsx b/src/components/ProcureDataNFTModal.tsx index 6c6b12ef..105c01f5 100644 --- a/src/components/ProcureDataNFTModal.tsx +++ b/src/components/ProcureDataNFTModal.tsx @@ -19,7 +19,7 @@ import { useGetAccountInfo, useGetLoginInfo, useGetNetworkConfig, useGetSignedTr import BigNumber from "bignumber.js"; import DataNFTLiveUptime from "components/UtilComps/DataNFTLiveUptime"; import { DataNftMarketContract } from "libs/MultiversX/dataNftMarket"; -import { DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftMetadataType } from "libs/MultiversX/types"; import { convertEsdtToWei, convertWeiToEsdt, @@ -29,52 +29,46 @@ import { tokenDecimals, getTokenWantedRepresentation, backendApi, + getApiDataMarshal, } from "libs/utils"; import { useAccountStore, useMarketStore } from "store"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; export interface ProcureAccessModalProps { isOpen: boolean; onClose: () => void; buyerFee: number; nftData: DataNftMetadataType; - offer: OfferType; + offer: Offer; amount: number; setSessionId?: (e: any) => void; + showCustomMintMsg?: boolean; } -export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData, offer, amount, setSessionId }: ProcureAccessModalProps) { +export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData, offer, amount, setSessionId, showCustomMintMsg }: ProcureAccessModalProps) { const { chainID } = useGetNetworkConfig(); const { address } = useGetAccountInfo(); const toast = useToast(); - const { colorMode } = useColorMode(); - const itheumPrice = useMarketStore((state) => state.itheumPrice); const itheumBalance = useAccountStore((state) => state.itheumBalance); const marketContract = new DataNftMarketContract(chainID); - const { tokenLogin, loginMethod } = useGetLoginInfo(); - const isWebWallet = loginMethod === "wallet"; - const backendUrl = backendApi(chainID); - const feePrice = printPrice( - convertWeiToEsdt(Number(offer.wanted_token_amount) * amount, tokenDecimals(offer.wanted_token_identifier)).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + convertWeiToEsdt(Number(offer.wantedTokenAmount) * amount, tokenDecimals(offer.wantedTokenIdentifier)).toNumber(), + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce) ); - const fee = convertWeiToEsdt(offer.wanted_token_amount, tokenDecimals(offer.wanted_token_identifier)).toNumber(); + const fee = convertWeiToEsdt(offer.wantedTokenAmount, tokenDecimals(offer.wantedTokenIdentifier)).toNumber(); const [readTermsChecked, setReadTermsChecked] = useState(false); const [liveUptimeFAIL, setLiveUptimeFAIL] = useState(true); const [isLiveUptimeSuccessful, setIsLiveUptimeSuccessful] = useState(false); - const [purchaseSessionId, setPurchaseSessionId] = useState(""); const [purchaseTxStatus, setPurchaseTxStatus] = useState(false); - const trackPurchaseTxStatus = useTrackTransactionStatus({ transactionId: purchaseSessionId, }); - const { hasSignedTransactions, signedTransactionsArray } = useGetSignedTransactions(); useEffect(() => { @@ -172,12 +166,12 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData } } - const paymentAmount = new BigNumber(offer.wanted_token_amount).multipliedBy(amount); + const paymentAmount = new BigNumber(offer.wantedTokenAmount).multipliedBy(amount); - if (offer.wanted_token_identifier == "EGLD") { - marketContract.sendAcceptOfferEgldTransaction(offer.index, paymentAmount.toFixed(), amount, address); + if (offer.wantedTokenIdentifier == "EGLD") { + marketContract.sendAcceptOfferEgldTransaction(offer.index, paymentAmount.toFixed(), amount, address, showCustomMintMsg); } else { - if (offer.wanted_token_nonce === 0) { + if (offer.wantedTokenNonce === 0) { //Check if we buy all quantity, use web wallet and are on that offer's details page and thus should use callback route const isOnOfferPage = window.location.pathname.includes("/offer-"); const shouldUseCallbackRoute = isWebWallet && amount == offer.quantity && isOnOfferPage; @@ -186,10 +180,11 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData const { sessionId } = await marketContract.sendAcceptOfferEsdtTransaction( offer.index, paymentAmount.toFixed(), - offer.wanted_token_identifier, + offer.wantedTokenIdentifier, amount as never, address, - shouldUseCallbackRoute ? callbackRoute : undefined + shouldUseCallbackRoute ? callbackRoute : undefined, + showCustomMintMsg ); setPurchaseSessionId(sessionId); if (isWebWallet) { @@ -200,13 +195,14 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData setSessionId(sessionId); } } else { - const { sessionId } = await marketContract.sendAcceptOfferNftEsdtTransaction( + const { sessionId } = await marketContract.sendAcceptOfferEsdtTransaction( offer.index, paymentAmount.toFixed(), - offer.wanted_token_identifier, - offer.wanted_token_nonce, - amount as never, - address + offer.wantedTokenIdentifier, + amount, + address, + "", + showCustomMintMsg ); setPurchaseSessionId(sessionId); if (isWebWallet) { @@ -232,7 +228,7 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData - Procure Access to Data NFTs + {showCustomMintMsg ? "Mint Data NFTs" : "Procure Access to Data NFTs"} {printPrice( convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount).multipliedBy(10000).div(10000 + buyerFee), - tokenDecimals(offer.wanted_token_identifier) + new BigNumber(offer.wantedTokenAmount).multipliedBy(10000).div(10000 + buyerFee), + tokenDecimals(offer.wantedTokenIdentifier) ).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce) )} ) : ( @@ -276,7 +272,7 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData - {new BigNumber(offer.wanted_token_amount).multipliedBy(amount).comparedTo(convertEsdtToWei(itheumBalance)) > 0 && ( + {new BigNumber(offer.wantedTokenAmount).multipliedBy(amount).comparedTo(convertEsdtToWei(itheumBalance)) > 0 && ( Your wallet token balance is too low to proceed @@ -288,9 +284,9 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData :{" "} {buyerFee ? `${buyerFee / 100}% (${convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount).multipliedBy(buyerFee).div(10000 + buyerFee), - tokenDecimals(offer.wanted_token_identifier) - ).toNumber()} ${getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)})` + new BigNumber(offer.wantedTokenAmount).multipliedBy(buyerFee).div(10000 + buyerFee), + tokenDecimals(offer.wantedTokenIdentifier) + ).toNumber()} ${getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce)})` : "-"} @@ -312,29 +308,29 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData {buyerFee ? ( <> - {new BigNumber(offer.wanted_token_amount).comparedTo(0) <= 0 ? ( + {new BigNumber(offer.wantedTokenAmount).comparedTo(0) <= 0 ? ( "" ) : ( <> {" " + convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount) + new BigNumber(offer.wantedTokenAmount) .multipliedBy(amount) .multipliedBy(10000) .div(10000 + buyerFee), - tokenDecimals(offer.wanted_token_identifier) + tokenDecimals(offer.wantedTokenIdentifier) ).toNumber() + " "} - {getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)} + {getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce)} {" + "} {convertWeiToEsdt( - new BigNumber(offer.wanted_token_amount) + new BigNumber(offer.wantedTokenAmount) .multipliedBy(amount) .multipliedBy(buyerFee) .div(10000 + buyerFee), - tokenDecimals(offer.wanted_token_identifier) + tokenDecimals(offer.wantedTokenIdentifier) ).toNumber()} - {" " + getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce)} + {" " + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce)} )} @@ -346,7 +342,7 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData setLiveUptimeFAIL(hasFailed)} isLiveUptimeSuccessful={isLiveUptimeSuccessful} @@ -375,7 +371,7 @@ export default function ProcureDataNFTModal({ isOpen, onClose, buyerFee, nftData isDisabled={ !readTermsChecked || liveUptimeFAIL || - new BigNumber(offer.wanted_token_amount).multipliedBy(amount).comparedTo(convertEsdtToWei(itheumBalance)) > 0 || + new BigNumber(offer.wantedTokenAmount).multipliedBy(amount).comparedTo(convertEsdtToWei(itheumBalance)) > 0 || !isLiveUptimeSuccessful }> Proceed diff --git a/src/components/Sections/RecentArticles.tsx b/src/components/Sections/RecentArticles.tsx index a3dd43fc..13405a95 100644 --- a/src/components/Sections/RecentArticles.tsx +++ b/src/components/Sections/RecentArticles.tsx @@ -4,6 +4,14 @@ import { Box, Heading, Text, Link, Card, CardBody, Stack, Flex } from "@chakra-u const RecentArticles = () => { return ( + + { imgLink="https://images.cointelegraph.com/images/1434_aHR0cHM6Ly9zMy5jb2ludGVsZWdyYXBoLmNvbS9zdG9yYWdlL3VwbG9hZHMvdmlldy8yMzQwMTg1MzQ5Njk5M2U0ZmY5OGU0NTUwMTE0N2I3Yy5qcGc=.jpg" /> - - (false); - const [latestOffers, setLatestOffers] = useState(latestOffersSkeleton); + const [latestOffers, setLatestOffers] = useState(latestOffersSkeleton); const { tokenLogin } = useGetLoginInfo(); - // console.log(latestOffers); + const marketRequirements = useMarketStore((state) => state.marketRequirements); const favoriteNfts = useAccountStore((state) => state.favoriteNfts); const updateFavoriteNfts = useAccountStore((state) => state.updateFavoriteNfts); const marketContract = new DataNftMarketContract(chainID); - const mintContract = new DataNftMintContract(chainID); useEffect(() => { apiWrapper(); @@ -66,7 +65,6 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea if (tokenLogin?.nativeAuthToken) { const bearerToken = tokenLogin?.nativeAuthToken; const getFavourites = await getFavoritesFromBackendApi(chainID, bearerToken); - // console.log(getFavourites, "FAVO"); updateFavoriteNfts(getFavourites); } }; @@ -79,31 +77,31 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea if (isApiUp) { const offers = await getRecentOffersFromBackendApi(chainID); - const recentNonces = offers.map((nft: any) => ({ nonce: nft.offered_token_nonce })); + const recentNonces = offers.map((nft: any) => ({ nonce: nft.offeredTokenNonce })); const dataNfts: DataNft[] = await DataNft.createManyFromApi(recentNonces); - const _latestOffers: DataNftCondensedView[] = []; + const _latestOffers: RecentDataNFTType[] = []; - offers.forEach((offer: any) => { + offers.forEach((offer: Offer) => { const matchingDataNft = dataNfts.find( - (dataNft: DataNft) => dataNft.nonce === offer.offered_token_nonce && dataNft.collection === offer.offered_token_identifier + (dataNft: DataNft) => dataNft.nonce === offer.offeredTokenNonce && dataNft.collection === offer.offeredTokenIdentifier ); if (matchingDataNft) { - const tokenAmount = convertWeiToEsdt(new BigNumber(offer.wanted_token_amount)).toNumber(); _latestOffers.push({ - data_nft_id: matchingDataNft?.tokenIdentifier, - offered_token_identifier: offer.offered_token_identifier, - offered_token_nonce: offer.offered_token_nonce, - offer_index: offer.index, - offered_token_amount: offer.offered_token_amount, + index: offer.index, + owner: new Address(offer.owner), + creator: new Address(matchingDataNft?.owner), + offeredTokenIdentifier: offer.offeredTokenIdentifier, + offeredTokenNonce: offer.offeredTokenNonce, + offeredTokenAmount: offer.offeredTokenAmount, + wantedTokenIdentifier: offer.wantedTokenIdentifier, + wantedTokenNonce: offer.wantedTokenNonce, + wantedTokenAmount: offer.wantedTokenAmount, quantity: offer.quantity, - wanted_token_amount: offer.wanted_token_amount, - creator: offer?.creator, tokenName: matchingDataNft?.tokenName, - title: offer?.title, + title: matchingDataNft?.title, nftImgUrl: matchingDataNft?.nftImgUrl, royalties: matchingDataNft?.royalties, - feePerSFT: tokenAmount, }); } }); @@ -122,34 +120,33 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea const offers = await marketContract.viewOffers(startIndex, stopIndex); const slicedOffers = offers.slice(0, 10); // get these offers metadata from the API - const nftIds = slicedOffers.map((offer) => `${offer.offered_token_identifier}-${hexZero(offer.offered_token_nonce)}`); + const nftIds = slicedOffers.map((offer) => `${offer.offeredTokenIdentifier}-${hexZero(offer.offeredTokenNonce)}`); const dataNfts = await getNftsByIds(nftIds, chainID); // merge the offer data and meta data - const _latestOffers: DataNftCondensedView[] = []; + const _latestOffers: RecentDataNFTType[] = []; slicedOffers.forEach((offer, idx) => { - const _nft = dataNfts.find((nft) => `${offer.offered_token_identifier}-${hexZero(offer.offered_token_nonce)}` === nft.identifier); + const _nft = dataNfts.find((nft) => createTokenIdentifier(nft.collection, nft.nonce) === nft.identifier); if (_nft !== undefined) { - const _nftMetaData = mintContract.decodeNftAttributes(_nft, idx); - - const tokenAmount = convertWeiToEsdt(new BigNumber(offer.wanted_token_amount)).toNumber(); + const _nftMetaData = DataNft.decodeAttributes(_nft); _latestOffers.push({ - data_nft_id: _nftMetaData.id, - offered_token_identifier: offer.offered_token_identifier, - offered_token_nonce: offer.offered_token_nonce, - offer_index: offer.index, - offered_token_amount: offer.offered_token_amount, + creator: new Address(_nftMetaData.creator), + owner: new Address(offer.owner), + offeredTokenIdentifier: offer.offeredTokenIdentifier, + offeredTokenNonce: offer.offeredTokenNonce, + offeredTokenAmount: offer.offeredTokenAmount, + index: idx, + wantedTokenIdentifier: offer.wantedTokenIdentifier, + wantedTokenNonce: offer.wantedTokenNonce, + wantedTokenAmount: offer.wantedTokenAmount, quantity: offer.quantity, - wanted_token_amount: offer.wanted_token_amount, - creator: _nftMetaData.creator, tokenName: _nftMetaData.tokenName, title: _nftMetaData.title, nftImgUrl: _nftMetaData.nftImgUrl, royalties: _nftMetaData.royalties, - feePerSFT: tokenAmount, }); } }); @@ -164,7 +161,6 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea if (isMxLoggedIn) { skeletonHeight = { base: "240px", md: "170px", "2xl": "190px" }; } - return ( <> @@ -174,12 +170,14 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea {loadedOffers && latestOffers.length === 0 && } - {latestOffers.map((item: DataNftCondensedView, idx: number) => { + {latestOffers.map((item: RecentDataNFTType, idx: number) => { return ( - + Data NFT Image @@ -188,11 +186,13 @@ const RecentDataNFTs = ({ headingText, headingSize }: { headingText: string; hea {item.title} - Supply Available : {item.quantity} - Unlock for {item.feePerSFT === 0 ? "Free" : `${item.feePerSFT} ITHEUM/NFT`} + Supply Available : {Number(item.quantity)} + + Unlock for {item.wantedTokenAmount === 0 ? "Free" : `${Number(convertWeiToEsdt(item.wantedTokenAmount))} ITHEUM/NFT`} + formatNumberRoundFloor(row.amount / Math.pow(10, 18)), - header: "Amount", + header: "Quantity", footer: (footerProps) => footerProps.column.id, }, ], diff --git a/src/components/Tables/TokenTxTable.tsx b/src/components/Tables/TokenTxTable.tsx index 482d2a51..9ec1a4d0 100644 --- a/src/components/Tables/TokenTxTable.tsx +++ b/src/components/Tables/TokenTxTable.tsx @@ -72,7 +72,7 @@ export default function TokenTxTable(props: TokenTableProps) { { id: "amount", accessorFn: (row) => row.value, - header: "Amount", + header: "Quantity", footer: (footerProps) => footerProps.column.id, }, { diff --git a/src/components/UtilComps/UpperCardComponent.tsx b/src/components/UtilComps/UpperCardComponent.tsx index 10be372d..d711414f 100644 --- a/src/components/UtilComps/UpperCardComponent.tsx +++ b/src/components/UtilComps/UpperCardComponent.tsx @@ -28,18 +28,19 @@ import { MdOutlineInfo } from "react-icons/md"; import { useNavigate } from "react-router-dom"; import FrozenOverlay from "components/FrozenOverlay"; import { CHAIN_TX_VIEWER, uxConfig } from "libs/config"; -import { DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftMetadataType } from "libs/MultiversX/types"; import { DEFAULT_NFT_IMAGE } from "libs/mxConstants"; import { convertToLocalString, convertWeiToEsdt, getTokenWantedRepresentation, printPrice, tokenDecimals, transformDescription } from "libs/utils"; import { useMarketStore, useMintStore } from "store"; import ShortAddress from "./ShortAddress"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; type UpperCardComponentProps = { nftImageLoading: boolean; setNftImageLoaded: Dispatch>; imageUrl: string; nftMetadata: DataNftMetadataType; - offer: OfferType; + offer: Offer; index: number; marketFreezedNonces: number[]; children?: React.ReactNode; @@ -71,11 +72,11 @@ const UpperCardComponent: FC = ({ const feePrice = offer ? printPrice( - convertWeiToEsdt(offer.wanted_token_amount as BigNumber.Value, tokenDecimals(offer.wanted_token_identifier)).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + convertWeiToEsdt(offer.wantedTokenAmount as BigNumber.Value, tokenDecimals(offer.wantedTokenIdentifier)).toNumber(), + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce) ) : ""; - const fee = offer ? convertWeiToEsdt(offer.wanted_token_amount as BigNumber.Value, tokenDecimals(offer.wanted_token_identifier)).toNumber() : 0; + const fee = offer ? convertWeiToEsdt(offer.wantedTokenAmount as BigNumber.Value, tokenDecimals(offer.wantedTokenIdentifier)).toNumber() : 0; const isMobile = window.innerWidth <= 480; return ( @@ -199,7 +200,7 @@ const UpperCardComponent: FC = ({ {address && address == nftMetadata.creator && ( - You are the Creator + You Created this )} @@ -207,7 +208,7 @@ const UpperCardComponent: FC = ({ {address && address == offer?.owner && ( - You are Owner + You Own this )} @@ -236,7 +237,7 @@ const UpperCardComponent: FC = ({ <> - Unlock from: {` `} + Get from: {` `} { <> {feePrice} {fee && itheumPrice ? `(~${convertToLocalString(fee * itheumPrice, 2)} USD)` : ""} @@ -259,7 +260,7 @@ const UpperCardComponent: FC = ({ (userData.addressFrozen || (userData.frozenNonces && offer && - (userData.frozenNonces.includes(offer.offered_token_nonce) || marketFreezedNonces.includes(offer.offered_token_nonce)))) + (userData.frozenNonces.includes(offer.offeredTokenNonce) || marketFreezedNonces.includes(offer.offeredTokenNonce)))) } /> diff --git a/src/components/WalletDataNFTMX/BurnDataNFTModal.tsx b/src/components/WalletDataNFTMX/BurnDataNFTModal.tsx index f120b539..6b4628c0 100644 --- a/src/components/WalletDataNFTMX/BurnDataNFTModal.tsx +++ b/src/components/WalletDataNFTMX/BurnDataNFTModal.tsx @@ -183,7 +183,7 @@ export default function BurnDataNFTModal(props: BurnDataNFTModalPropType) { - Burn Amount:    + Burn Quantity:    {dataNftBurnAmount} diff --git a/src/components/WalletDataNFTMX/WalletDataNFTMX.tsx b/src/components/WalletDataNFTMX/WalletDataNFTMX.tsx index cbfb748b..001c3453 100644 --- a/src/components/WalletDataNFTMX/WalletDataNFTMX.tsx +++ b/src/components/WalletDataNFTMX/WalletDataNFTMX.tsx @@ -133,14 +133,14 @@ export default function WalletDataNFTMX(item: WalletDataNFTMxPropType) { if (txData.type === "add-offer-tx") { addOfferBackend( webWalletListTxHash, - txData.offered_token_identifier, - txData.offered_token_nonce, - txData.offered_token_amount, + txData.offeredTokenIdentifier, + txData.offeredTokenNonce, + txData.offeredTokenAmount, txData.title, txData.description, - txData.wanted_token_identifier, - txData.wanted_token_nonce, - txData.wanted_token_amount, + txData.wantedTokenIdentifier, + txData.wantedTokenNonce, + txData.wantedTokenAmount, txData.quantity, txData.owner ); @@ -151,14 +151,14 @@ export default function WalletDataNFTMX(item: WalletDataNFTMxPropType) { async function addOfferBackend( txHash: string, - offered_token_identifier: string, - offered_token_nonce: string, - offered_token_amount: string, + offeredTokenIdentifier: string, + offeredTokenNonce: string, + offeredTokenAmount: string, title: string, description: string, - wanted_token_identifier: string, - wanted_token_nonce: string, - wanted_token_amount: string, + wantedTokenIdentifier: string, + wantedTokenNonce: string, + wantedTokenAmount: string, quantity: number, owner: string ) { @@ -206,14 +206,14 @@ export default function WalletDataNFTMX(item: WalletDataNFTMxPropType) { const requestBody = { index: index, - offered_token_identifier: offered_token_identifier, - offered_token_nonce: offered_token_nonce, - offered_token_amount: offered_token_amount, + offeredTokenIdentifier: offeredTokenIdentifier, + offeredTokenNonce: offeredTokenNonce, + offeredTokenAmount: offeredTokenAmount, title: title, description: description, - wanted_token_identifier: wanted_token_identifier, - wanted_token_nonce: wanted_token_nonce, - wanted_token_amount: wanted_token_amount, + wantedTokenIdentifier: wantedTokenIdentifier, + wantedTokenNonce: wantedTokenNonce, + wantedTokenAmount: wantedTokenAmount, quantity: quantity, owner: owner, }; @@ -589,7 +589,11 @@ export default function WalletDataNFTMX(item: WalletDataNFTMxPropType) { nftData={selectedDataNft} marketContract={marketContract} sellerFee={item.sellerFee || 0} - offer={{ wanted_token_identifier: contractsForChain(chainID).itheumToken, wanted_token_amount: price, wanted_token_nonce: 0 }} + offer={{ + wantedTokenIdentifier: contractsForChain(chainID).itheumToken, + wantedTokenAmount: price.toString(), + wantedTokenNonce: 0, + }} amount={amount} setAmount={setAmount} /> diff --git a/src/libs/MultiversX/backend-api.ts b/src/libs/MultiversX/backend-api.ts index 126953c2..f3e80532 100644 --- a/src/libs/MultiversX/backend-api.ts +++ b/src/libs/MultiversX/backend-api.ts @@ -1,8 +1,8 @@ -import { MarketplaceRequirements } from "@itheum/sdk-mx-data-nft/out"; +import { MarketplaceRequirements, Offer } from "@itheum/sdk-mx-data-nft/out"; import axios from "axios"; import { backendApi } from "libs/utils"; import { uxConfig } from "."; -import { DataNftCollectionType, Favorite, OfferType, TrendingNft } from "./types"; +import { DataNftCollectionType, Favorite, TrendingNft } from "./types"; export async function getHealthCheckFromBackendApi(chainID: string): Promise { try { @@ -119,13 +119,13 @@ export async function getOffersCountFromBackendApi(chainID: string, address?: st } } -export async function getOffersFromBackendApi(chainID: string, from: number, size: number, address?: string): Promise { +export async function getOffersFromBackendApi(chainID: string, from: number, size: number, address?: string): Promise { try { let url = `${backendApi(chainID)}/offers?from=${from}&size=${size}`; if (address) { url += `&address=${address}`; } - const { data } = await axios.get(url, { + const { data } = await axios.get(url, { timeout: uxConfig.mxAPITimeoutMs, }); return data; @@ -137,7 +137,7 @@ export async function getOffersFromBackendApi(chainID: string, from: number, siz export async function getOfersAsCollectionFromBackendApi(chainID: string): Promise { try { - let url = `${backendApi(chainID)}/data-nfts`; + const url = `${backendApi(chainID)}/data-nfts`; const { data } = await axios.get(url, { timeout: uxConfig.mxAPITimeoutMs, @@ -149,10 +149,10 @@ export async function getOfersAsCollectionFromBackendApi(chainID: string): Promi } } -export async function getRecentOffersFromBackendApi(chainID: string): Promise { +export async function getRecentOffersFromBackendApi(chainID: string): Promise { try { const url = `${backendApi(chainID)}/offers/recent`; - const { data } = await axios.get(url, { + const { data } = await axios.get(url, { timeout: uxConfig.mxAPITimeoutMs, }); @@ -169,7 +169,7 @@ export async function getOffersByIdAndNoncesFromBackendApi( nonces: number[], from?: number, size?: number -): Promise { +): Promise { if (nonces.length === 0) { throw Error("getOffersByIdAndNoncesFromBackendApi: nonces must not be empty."); } @@ -182,7 +182,7 @@ export async function getOffersByIdAndNoncesFromBackendApi( url += `&size=${size}`; } - const { data } = await axios.get(url, { + const { data } = await axios.get(url, { timeout: uxConfig.mxAPITimeoutMs, }); diff --git a/src/libs/MultiversX/custom.css b/src/libs/MultiversX/custom.css index 1a768e39..fad1b0ac 100644 --- a/src/libs/MultiversX/custom.css +++ b/src/libs/MultiversX/custom.css @@ -361,6 +361,29 @@ body { } } +@keyframes Shake { + 10%, + 90% { + transform: translate3d(-0.5px, 0, 0); + } + + 20%, + 80% { + transform: translate3d(0.5px, 0, 0); + } + + 30%, + 50%, + 70% { + transform: translate3d(-1px, 0, 0); + } + + 40%, + 60% { + transform: translate3d(1px, 0, 0); + } +} + .dapp-core-component__dappModalStyles__dappModalContent.dapp-modal-dialog-content { margin-top: 0px !important; margin-bottom: 4rem !important; diff --git a/src/libs/MultiversX/dataNftMarket.ts b/src/libs/MultiversX/dataNftMarket.ts index cdafef21..874c0da7 100644 --- a/src/libs/MultiversX/dataNftMarket.ts +++ b/src/libs/MultiversX/dataNftMarket.ts @@ -1,9 +1,7 @@ import { useToast } from "@chakra-ui/react"; +import { DataNftMarket, Offer } from "@itheum/sdk-mx-data-nft/out"; import { - AbiRegistry, - SmartContract, Address, - ResultsParser, BigUIntValue, Transaction, ContractFunction, @@ -11,109 +9,57 @@ import { TokenIdentifierValue, AddressValue, StringValue, - U32Value, - AddressType, - OptionalValue, - BooleanValue, ContractCallPayloadBuilder, } from "@multiversx/sdk-core/out"; import { sendTransactions } from "@multiversx/sdk-dapp/services"; import { refreshAccount } from "@multiversx/sdk-dapp/utils/account"; import BigNumber from "bignumber.js"; -import { uxConfig } from "libs/config"; +import { contractsForChain, uxConfig } from "libs/config"; import { labels } from "libs/language"; -import jsonData from "./ABIs/data_market.abi.json"; -import { getNetworkProvider } from "./api"; -import { MarketplaceRequirementsType, OfferType } from "./types"; -import { contractsForChain } from "../config"; +import { MarketplaceRequirementsType } from "./types"; export class DataNftMarketContract { - timeout: number; - dataNftMarketContractAddress: any; - chainID: string; - contract: SmartContract; + contract: DataNftMarket; itheumToken: string; toast = useToast(); constructor(chainID: string) { - this.timeout = uxConfig.mxAPITimeoutMs; - this.dataNftMarketContractAddress = contractsForChain(chainID).market; - this.chainID = chainID; - - const json = JSON.parse(JSON.stringify(jsonData)); - const abiRegistry = AbiRegistry.create(json); - - this.contract = new SmartContract({ - address: new Address(this.dataNftMarketContractAddress), - abi: abiRegistry, - }); - - this.itheumToken = contractsForChain(chainID).itheumToken as unknown as string; - } - - async viewNumberOfOffers() { - const interaction = this.contract.methods.viewNumberOfOffers([]); - const query = interaction.buildQuery(); - - try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - - const { firstValue, returnCode } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (returnCode && returnCode.isSuccess()) { - const firstValueAsStruct = firstValue as U32Value; - return firstValueAsStruct.valueOf().toNumber(); - } else { - const nonOKErr = new Error("viewNumberOfOffers returnCode returned a non OK value"); - console.error(nonOKErr); - - return 0; - } - } catch (error) { - console.error(error); - - return 0; + let env = "devnet"; + if (chainID === "1") { + env = "mainnet"; } + this.contract = new DataNftMarket(env, uxConfig.mxAPITimeoutMs); + this.itheumToken = contractsForChain(chainID).itheumToken as unknown as string; // TODO: check if working without last part } - async sendAcceptOfferEsdtTransaction(index: number, paymentAmount: string, tokenId: string, amount: number, sender: string, callbackRoute?: string) { - const data = - new BigNumber(paymentAmount).comparedTo(0) > 0 - ? new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("ESDTTransfer")) - .addArg(new TokenIdentifierValue(tokenId)) - .addArg(new BigUIntValue(paymentAmount)) - .addArg(new StringValue("acceptOffer")) - .addArg(new U64Value(index)) - .addArg(new BigUIntValue(amount)) - .build() - : new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("acceptOffer")) - .addArg(new U64Value(index)) - .addArg(new BigUIntValue(amount)) - .build(); - - const offerEsdtTx = new Transaction({ - value: 0, - data, - receiver: new Address(this.dataNftMarketContractAddress), - sender: new Address(sender), - gasLimit: 20000000, - chainID: this.chainID, - }); + async sendAcceptOfferEsdtTransaction( + index: number, + paymentAmount: string, + tokenId: string, + amount: number, + sender: string, + callbackRoute?: string, + showCustomMintMsg?: boolean + ) { + let offerEsdtTx; + if (new BigNumber(paymentAmount).comparedTo(0) > 0) { + offerEsdtTx = this.contract.acceptOfferWithESDT(new Address(sender), index, amount, new BigNumber(paymentAmount), tokenId); + } else { + offerEsdtTx = this.contract.acceptOfferWithNoPayment(new Address(sender), index, amount); + } + offerEsdtTx.setGasLimit(20000000); await refreshAccount(); + const actionMsg = showCustomMintMsg ? "Minting Data NFT" : "Accepting offer"; + const { sessionId, error } = await sendTransactions({ transactions: offerEsdtTx, transactionsDisplayInfo: { - processingMessage: "Accepting offer", - errorMessage: "Error occurred during accepting offer", - successMessage: "Offer accepted successfully", + processingMessage: actionMsg, + errorMessage: `${actionMsg} failed :(`, + successMessage: `${actionMsg} successful!`, }, redirectAfterSign: callbackRoute ? true : false, callbackRoute: callbackRoute ?? window.location.pathname, @@ -129,7 +75,8 @@ export class DataNftMarketContract { nonce: number, amount: number, senderAddress: string, - callbackRoute?: string + callbackRoute?: string, + showCustomMintMsg?: boolean ) { const offerEsdtTx = new Transaction({ value: 0, @@ -138,7 +85,7 @@ export class DataNftMarketContract { .addArg(new TokenIdentifierValue(tokenId)) .addArg(new U64Value(nonce)) .addArg(new BigUIntValue(paymentAmount)) - .addArg(new AddressValue(new Address(this.dataNftMarketContractAddress))) + .addArg(new AddressValue(this.contract.getContractAddress())) .addArg(new StringValue("acceptOffer")) .addArg(new U64Value(index)) .addArg(new BigUIntValue(amount)) @@ -146,17 +93,19 @@ export class DataNftMarketContract { receiver: new Address(senderAddress), sender: new Address(senderAddress), gasLimit: 20000000, - chainID: this.chainID, + chainID: this.contract.chainID, }); await refreshAccount(); + const actionMsg = showCustomMintMsg ? "Minting Data NFT" : "Accepting offer"; + const { sessionId, error } = await sendTransactions({ transactions: offerEsdtTx, transactionsDisplayInfo: { - processingMessage: "Accepting offer", - errorMessage: "Error occurred during accepting offer", - successMessage: "Offer accepted successfully", + processingMessage: actionMsg, + errorMessage: `${actionMsg} failed :(`, + successMessage: `${actionMsg} successful!`, }, redirectAfterSign: callbackRoute ? true : false, callbackRoute: callbackRoute ?? window.location.pathname, @@ -165,28 +114,19 @@ export class DataNftMarketContract { return { sessionId, error }; } - async sendAcceptOfferEgldTransaction(index: number, paymentAmount: string, amount: number, senderAddress: string) { - const offerEgldTx = new Transaction({ - value: paymentAmount, - data: new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("acceptOffer")) - .addArg(new U64Value(index)) - .addArg(new BigUIntValue(amount)) - .build(), - receiver: new Address(this.dataNftMarketContractAddress), - gasLimit: 20000000, - sender: new Address(senderAddress), - chainID: this.chainID, - }); + async sendAcceptOfferEgldTransaction(index: number, paymentAmount: string, amount: number, senderAddress: string, showCustomMintMsg?: boolean) { + const offerEgldTx = this.contract.acceptOfferWithEGLD(new Address(senderAddress), index, amount, new BigNumber(paymentAmount)); await refreshAccount(); + const actionMsg = showCustomMintMsg ? "Minting Data NFT" : "Accepting Offer"; + const { sessionId, error } = await sendTransactions({ transactions: offerEgldTx, transactionsDisplayInfo: { - processingMessage: "Accepting offer", - errorMessage: "Error occurred during accepting offer", - successMessage: "Offer accepted successfully", + processingMessage: actionMsg, + errorMessage: `${actionMsg} failed :(`, + successMessage: `${actionMsg} successful!`, }, redirectAfterSign: false, }); @@ -195,18 +135,7 @@ export class DataNftMarketContract { } async sendCancelOfferTransaction(index: number, senderAddress: string) { - const cancelTx = new Transaction({ - value: 0, - data: new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("cancelOffer")) - .addArg(new U64Value(index)) - .addArg(new BooleanValue(true)) - .build(), - receiver: new Address(this.dataNftMarketContractAddress), - gasLimit: 20000000, - sender: new Address(senderAddress), - chainID: this.chainID, - }); + const cancelTx = this.contract.cancelOffer(new Address(senderAddress), index); await refreshAccount(); @@ -214,7 +143,7 @@ export class DataNftMarketContract { transactions: cancelTx, transactionsDisplayInfo: { processingMessage: "Cancelling offer", - errorMessage: "Error occurred during offer cancellation", + errorMessage: "Cancelling offer failed :(", successMessage: "Offer cancelled successfully", }, redirectAfterSign: false, @@ -223,33 +152,25 @@ export class DataNftMarketContract { return { sessionId, error }; } - async addToMarket(addTokenCollection: string, addTokenNonce: number, addTokenQuantity: number, price: number, addressOfSender: string) { - const addERewTx = new Transaction({ - value: 0, - data: new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("ESDTNFTTransfer")) //method - .addArg(new TokenIdentifierValue(addTokenCollection)) //what token id to send - .addArg(new U64Value(addTokenNonce)) //what token nonce to send - .addArg(new BigUIntValue(addTokenQuantity)) //how many tokens to send - .addArg(new AddressValue(new Address(this.dataNftMarketContractAddress))) //address to send to - .addArg(new StringValue("addOffer")) //what method to call on the contract - .addArg(new TokenIdentifierValue(this.itheumToken)) //what token id to ask for - .addArg(new U64Value(0)) //what nonce to ask for - .addArg(new BigUIntValue(price * 10 ** 18)) //how much to ask for - .addArg(new BigUIntValue(0)) // minimum amount for seller - setting will be introduced in the future - .addArg(new BigUIntValue(addTokenQuantity)) //how many times to divide the amount of tokens sent into - .build(), - receiver: new Address(addressOfSender), - sender: new Address(addressOfSender), - gasLimit: 20000000, - chainID: this.chainID, - }); + async addToMarket(addTokenCollection: string, addTokenNonce: number, addTokenQuantity: number, price: BigNumber.Value, addressOfSender: string) { + const addToMarketTx = this.contract.addOffer( + new Address(addressOfSender), + addTokenCollection, + addTokenNonce, + addTokenQuantity, + this.itheumToken, + 0, + new BigNumber(price).multipliedBy(10 ** 18), + 0 + ); + await refreshAccount(); + const { sessionId, error } = await sendTransactions({ - transactions: addERewTx, + transactions: addToMarketTx, transactionsDisplayInfo: { processingMessage: "Adding Data NFT to marketplace", - errorMessage: "Error occurred", + errorMessage: "Adding Data NFT to marketplace failed :(", successMessage: "Data NFT added to marketplace", }, redirectAfterSign: false, @@ -259,29 +180,15 @@ export class DataNftMarketContract { } async delistDataNft(index: number, delistAmount: number, senderAddress: string) { - const data = new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("cancelOffer")) - .addArg(new U64Value(index)) - .addArg(new BigUIntValue(delistAmount)) - .addArg(new BooleanValue(true)) - .build(); - - const tx = new Transaction({ - value: "0", - data, - receiver: new Address(this.dataNftMarketContractAddress), - gasLimit: 20000000, - sender: new Address(senderAddress), - chainID: this.chainID, - }); + const cancelOfferTx = this.contract.cancelOffer(new Address(senderAddress), index); await refreshAccount(); const { sessionId, error } = await sendTransactions({ - transactions: tx, + transactions: cancelOfferTx, transactionsDisplayInfo: { - processingMessage: "De-Listing offer", - errorMessage: "Error occurred during de-listing offer", + processingMessage: "De-listing offer", + errorMessage: "De-listing offer failed :(", successMessage: "Offer de-listed successfully", }, redirectAfterSign: false, @@ -291,38 +198,30 @@ export class DataNftMarketContract { return { sessionId, error }; } - async viewRequirements(): Promise { - const interaction = this.contract.methodsExplicit.viewRequirements(); - const query = interaction.buildQuery(); - + async viewNumberOfOffers() { try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return undefined; - } + const numberOfOffers = await this.contract.viewNumberOfOffers(); + return numberOfOffers; + } catch (e) { + console.error(e); + this.toast({ + title: labels.ERR_MARKET_NR_OFFERS_FAIL, + status: "error", + isClosable: true, + duration: 20000, + }); + return undefined; + } + } - const value = firstValue.valueOf(); - const decoded = { - accepted_tokens: value.accepted_tokens.map((v: any) => v.toString()), - accepted_payments: value.accepted_payments.map((v: any) => v.toString()), - maximum_payment_fees: value.maximum_payment_fees.map((v: any) => v.toFixed()), - discount_fee_percentage_buyer: value.discount_fee_percentage_buyer.toNumber(), - discount_fee_percentage_seller: value.discount_fee_percentage_seller.toNumber(), - percentage_cut_from_buyer: value.percentage_cut_from_buyer.toNumber(), - percentage_cut_from_seller: value.percentage_cut_from_seller.toNumber(), - buyer_fee: 0, - seller_fee: 0, + async viewRequirements(): Promise { + try { + const marketplaceRequirements = await this.contract.viewRequirements(); + return { + ...marketplaceRequirements, + buyerFee: marketplaceRequirements.buyerTaxPercentage - marketplaceRequirements.buyerTaxPercentageDiscount, + sellerFee: marketplaceRequirements.sellerTaxPercentage - marketplaceRequirements.sellerTaxPercentageDiscount, }; - decoded.buyer_fee = decoded.percentage_cut_from_buyer - decoded.discount_fee_percentage_buyer; - decoded.seller_fee = decoded.percentage_cut_from_seller - decoded.discount_fee_percentage_seller; - - return decoded; } catch (e) { console.error(e); this.toast({ @@ -335,39 +234,15 @@ export class DataNftMarketContract { } } - async viewOffers(startIndex: number, stopIndex: number): Promise { - // this will spread out a new array from startIndex to stopIndex e.g. startIndex=0, stopIndex=5 : you get [1,2,3,4,5] - const indexRange = Array.from({ length: stopIndex - startIndex }, (_, i) => new U64Value(startIndex + 1 + i)); - - const interaction = this.contract.methodsExplicit.viewOffers(indexRange); - const query = interaction.buildQuery(); - + async viewOffers(startIndex: number, stopIndex: number): Promise { try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return []; + const indexRange = []; + for (let i = startIndex; i < stopIndex; i++) { + indexRange.push(i + 1); } + const offers = this.contract.viewOffers(indexRange); - const values = firstValue.valueOf(); - const decoded = values.map((value: any) => ({ - index: value.offer_id.toNumber(), - owner: value.owner.toString(), - offered_token_identifier: value.offered_token_identifier.toString(), - offered_token_nonce: value.offered_token_nonce.toNumber(), - offered_token_amount: value.offered_token_amount.toFixed(), - wanted_token_identifier: value.wanted_token_identifier.toString(), - wanted_token_nonce: value.wanted_token_nonce.toNumber(), - wanted_token_amount: value.wanted_token_amount.toFixed(), - quantity: value.quantity.toNumber(), - })); - - return decoded; + return offers; } catch (e) { console.error(e); this.toast({ @@ -380,40 +255,11 @@ export class DataNftMarketContract { } } - async viewPagedOffers(startIndex: number, stopIndex: number, userAddress?: string): Promise { - const interaction = this.contract.methodsExplicit.viewPagedOffers([ - new U64Value(startIndex), - new U64Value(stopIndex), - userAddress ? new OptionalValue(new AddressType(), new AddressValue(new Address(userAddress))) : OptionalValue.newMissing(), - ]); - const query = interaction.buildQuery(); - + async viewPagedOffers(startIndex: number, stopIndex: number, userAddress?: string): Promise { try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return []; - } + const pagedOffers = await this.contract.viewPagedOffers(startIndex, stopIndex, new Address(userAddress)); - const values = firstValue.valueOf(); - const decoded = values.map((value: any) => ({ - index: value.offer_id.toNumber(), - owner: value.owner.toString(), - offered_token_identifier: value.offered_token_identifier.toString(), - offered_token_nonce: value.offered_token_nonce.toNumber(), - offered_token_amount: value.offered_token_amount.toFixed(), - wanted_token_identifier: value.wanted_token_identifier.toString(), - wanted_token_nonce: value.wanted_token_nonce.toNumber(), - wanted_token_amount: value.wanted_token_amount.toFixed(), - quantity: value.quantity.toNumber(), - })); - - return decoded; + return pagedOffers; } catch (e) { console.error(e); this.toast({ @@ -426,36 +272,10 @@ export class DataNftMarketContract { } } - async viewOffer(index: number): Promise { - const interaction = this.contract.methodsExplicit.viewOffer([new U64Value(index)]); - const query = interaction.buildQuery(); - + async viewOffer(index: number): Promise { try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return undefined; - } - - const value = firstValue.valueOf(); - const decoded = { - index: value.offer_id.toNumber(), - owner: value.owner.toString(), - offered_token_identifier: value.offered_token_identifier.toString(), - offered_token_nonce: value.offered_token_nonce.toNumber(), - offered_token_amount: value.offered_token_amount.toFixed(), - wanted_token_identifier: value.wanted_token_identifier.toString(), - wanted_token_nonce: value.wanted_token_nonce.toNumber(), - wanted_token_amount: value.wanted_token_amount.toFixed(), - quantity: value.quantity.toNumber(), - }; - - return decoded; + const offer = this.contract.viewOffer(index); + return offer; } catch (e) { console.error(e); this.toast({ @@ -469,25 +289,9 @@ export class DataNftMarketContract { } async viewUserTotalOffers(userAddress: string): Promise { - const interaction = this.contract.methodsExplicit.viewUserTotalOffers([new AddressValue(new Address(userAddress))]); - const query = interaction.buildQuery(); - try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return 0; - } - - const value = firstValue.valueOf(); - const decoded = value.toNumber(); - - return decoded; + const userTotalOffers = await this.contract.viewAddressTotalOffers(new Address(userAddress)); + return userTotalOffers; } catch (e) { console.error(e); this.toast({ @@ -501,29 +305,15 @@ export class DataNftMarketContract { } async updateOfferPrice(index: number, newPrice: string, senderAddress: string) { - const data = new ContractCallPayloadBuilder() - .setFunction(new ContractFunction("changeOfferPrice")) - .addArg(new U64Value(index)) - .addArg(new BigUIntValue(newPrice)) - .addArg(new BigUIntValue(0)) - .build(); - - const tx = new Transaction({ - value: "0", - data, - receiver: new Address(this.dataNftMarketContractAddress), - gasLimit: 20000000, - sender: new Address(senderAddress), - chainID: this.chainID, - }); + const changeOfferPriceTx = await this.contract.changeOfferPrice(new Address(senderAddress), index, new BigNumber(newPrice), 0); await refreshAccount(); const { sessionId, error } = await sendTransactions({ - transactions: tx, + transactions: changeOfferPriceTx, transactionsDisplayInfo: { processingMessage: "Updating price", - errorMessage: "Error occurred during updating price", + errorMessage: "Updating price failed :(", successMessage: "Fee updated successfully", }, redirectAfterSign: false, @@ -534,25 +324,11 @@ export class DataNftMarketContract { } async getLastValidOfferId(): Promise { - const interaction = this.contract.methodsExplicit.getLastValidOfferId(); - const query = interaction.buildQuery(); + const lastValidOfferId = await this.contract.viewLastValidOfferId(); try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - console.error(returnMessage); - return 0; - } - - const value = firstValue.valueOf(); - const decoded = value.toNumber(); - - return decoded; + lastValidOfferId; + return lastValidOfferId; } catch (e) { console.error(e); this.toast({ @@ -566,24 +342,9 @@ export class DataNftMarketContract { } async getIsPaused(): Promise { - const interaction = this.contract.methodsExplicit.getIsPaused(); - const query = interaction.buildQuery(); - try { - const networkProvider = getNetworkProvider(this.chainID); - - const res = await networkProvider.queryContract(query); - const endpointDefinition = interaction.getEndpoint(); - const { firstValue, returnCode, returnMessage } = new ResultsParser().parseQueryResponse(res, endpointDefinition); - - if (!firstValue || !returnCode.isSuccess()) { - throw Error(returnMessage); - } - - const value = firstValue.valueOf(); - const decoded = value; - - return decoded; + const isPaused = await this.contract.viewContractPauseState(); + return isPaused; } catch (e) { console.error(e); this.toast({ diff --git a/src/libs/MultiversX/dataNftMint.ts b/src/libs/MultiversX/dataNftMint.ts index 361f2c4d..a180a6fe 100644 --- a/src/libs/MultiversX/dataNftMint.ts +++ b/src/libs/MultiversX/dataNftMint.ts @@ -122,9 +122,9 @@ export class DataNftMintContract { const { sessionId, error } = await sendTransactions({ transactions: mintTransaction, transactionsDisplayInfo: { - processingMessage: "Minting Data NFT", - errorMessage: "Data NFT minting error", - successMessage: "Data NFT minted successfully", + processingMessage: "Minting Data NFT Collection", + errorMessage: "Collection minting failed :(", + successMessage: "Collection minted successfully!", }, redirectAfterSign: false, }); @@ -152,7 +152,7 @@ export class DataNftMintContract { transactions: tx, transactionsDisplayInfo: { processingMessage: "Burning Data NFT", - errorMessage: "Error occurred during burning NFT", + errorMessage: "Burning Data NFT failed :(", successMessage: "Data NFT burnt", }, redirectAfterSign: false, diff --git a/src/libs/MultiversX/types.ts b/src/libs/MultiversX/types.ts index 8e0572c1..85baf467 100644 --- a/src/libs/MultiversX/types.ts +++ b/src/libs/MultiversX/types.ts @@ -22,45 +22,18 @@ export interface DataNftMetadataType { collection: string; } -export interface DataNftCondensedView { - data_nft_id: string; // API (as id) - offered_token_identifier: string; // SC - offered_token_nonce: number; // SC - offer_index: number; // SC - offered_token_amount: string; // SC - quantity: number; // SC - wanted_token_amount: string; // SC - creator: string; // api - tokenName: string; // api - title: string; // api - nftImgUrl?: string; // api - royalties: number; // api, - feePerSFT: number; // calculation, -} - export interface MarketplaceRequirementsType { - accepted_tokens: string[]; - accepted_payments: string[]; - maximum_payment_fees: string[]; - discount_fee_percentage_buyer: number; - discount_fee_percentage_seller: number; - percentage_cut_from_buyer: number; - percentage_cut_from_seller: number; - buyer_fee: number; - seller_fee: number; + acceptedTokens: string[]; + acceptedPayments: string[]; + maximumPaymentFees: string[]; + buyerTaxPercentageDiscount: number; + sellerTaxPercentageDiscount: number; + buyerTaxPercentage: number; + sellerTaxPercentage: number; + buyerFee: number; + sellerFee: number; } -export interface OfferType { - index: number; - owner: string; - offered_token_identifier: string; - offered_token_nonce: number; - offered_token_amount: string; - wanted_token_identifier: string; - wanted_token_nonce: number; - wanted_token_amount: string; - quantity: number; -} export interface DataNftCollectionType { tokenIdentifier: string; nftImgUrl: string; @@ -76,7 +49,7 @@ export interface DataNftCollectionType { royalties: string; nonce: number; collection: string; - minOffer: OfferType; + minOffer: Offer; } export interface Favorite { diff --git a/src/libs/config.ts b/src/libs/config.ts index ac03f682..d9f3b3e1 100644 --- a/src/libs/config.ts +++ b/src/libs/config.ts @@ -449,12 +449,14 @@ export const EXPLORER_APP_SUPPORTED_NONCES: Record> = { "multiversxbubbles": "https://test.explorer.itheum.io/multiversx-bubbles", "multiversxinfographics": "https://test.explorer.itheum.io/multiversx-infographics", "nftunes": "https://test.explorer.itheum.io/nftunes", + "timecapsule": "https://test.explorer.itheum.io/timecapsule", }, "1": { "trailblazer": "https://explorer.itheum.io/project-trailblazer", "multiversxbubbles": "https://explorer.itheum.io/multiversx-bubbles", "multiversxinfographics": "https://explorer.itheum.io/multiversx-infographics", "nftunes": "https://explorer.itheum.io/nftunes", + "timecapsule": "https://explorer.itheum.io/timecapsule", }, }; diff --git a/src/libs/language.ts b/src/libs/language.ts index bf4e4401..35fa1e7e 100644 --- a/src/libs/language.ts +++ b/src/libs/language.ts @@ -41,4 +41,5 @@ export const labels = { "MINT_FORM_POPUP_INFO_ROYALTY": 'The "Creator Royalty" you will earn each time a copy is re-traded in the Data NFT Marketplace', "ADD_FAVORITE_FAILS": "Could not add to favorites. (ER-27)", "REMOVE_FAVORITE_FAILS": "Could not remove from favorites. (ER-28)", + "ERR_MARKET_NR_OFFERS_FAIL": "Could not fetch number of marketplace offers. (ER-29)", }; diff --git a/src/libs/types.ts b/src/libs/types.ts index 40768052..04459953 100644 --- a/src/libs/types.ts +++ b/src/libs/types.ts @@ -1,12 +1,32 @@ +import { IAddress } from "@multiversx/sdk-core/out"; +import BigNumber from "bignumber.js"; + export interface ContractsType { itheumToken: string; - claims: string; - faucet: string; - market: string; + claims: IAddress; + faucet: IAddress; + market: IAddress; dataNftTokens: DataNFTToken[]; } +export interface RecentDataNFTType { + index: BigNumber.Value; + owner: IAddress; + creator: IAddress; + offeredTokenIdentifier: string; + offeredTokenNonce: BigNumber.Value; + offeredTokenAmount: BigNumber.Value; + wantedTokenIdentifier: string; + wantedTokenNonce: BigNumber.Value; + wantedTokenAmount: BigNumber.Value; + quantity: BigNumber.Value; + tokenName?: string; + title?: string; + nftImgUrl?: string; + royalties?: BigNumber.Value; +} + export interface DataNFTToken { id: string; - contract: string; + contract: IAddress; } diff --git a/src/pages/AdvertiseData/TradeData.tsx b/src/pages/AdvertiseData/TradeData.tsx index d6f708e1..9164ebad 100644 --- a/src/pages/AdvertiseData/TradeData.tsx +++ b/src/pages/AdvertiseData/TradeData.tsx @@ -17,7 +17,7 @@ export const TradeData: React.FC = () => { Mint Data - Connect, mint and trade your datasets as Data NFTs in our Data NFT Marketplace + Connect, mint and trade your Data Streams as Data NFTs in our Data NFT Marketplace diff --git a/src/pages/AdvertiseData/components/MintingModal.tsx b/src/pages/AdvertiseData/components/MintingModal.tsx index 587bf661..628fd61e 100644 --- a/src/pages/AdvertiseData/components/MintingModal.tsx +++ b/src/pages/AdvertiseData/components/MintingModal.tsx @@ -47,7 +47,7 @@ export const MintingModal: React.FC = (props) => { - Data NFT Minting Progress + Data NFT Collection Minting Progress {!!errDataNFTStreamGeneric && } diff --git a/src/pages/DataNFT/DataNFTDetails.tsx b/src/pages/DataNFT/DataNFTDetails.tsx index 2c1b0177..30f30fe6 100644 --- a/src/pages/DataNFT/DataNFTDetails.tsx +++ b/src/pages/DataNFT/DataNFTDetails.tsx @@ -25,6 +25,7 @@ import { useToast, VStack, } from "@chakra-ui/react"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; import { useGetAccountInfo, useGetNetworkConfig, useGetPendingTransactions, useTrackTransactionStatus } from "@multiversx/sdk-dapp/hooks"; import { useGetLoginInfo } from "@multiversx/sdk-dapp/hooks/account"; import axios from "axios"; @@ -40,14 +41,12 @@ import TokenTxTable from "components/Tables/TokenTxTable"; import ConditionalRender from "components/UtilComps/ApiWrapper"; import ExploreAppButton from "components/UtilComps/ExploreAppButton"; import ShortAddress from "components/UtilComps/ShortAddress"; -import { CHAIN_TX_VIEWER, PREVIEW_DATA_ON_DEVNET_SESSION_KEY, uxConfig } from "libs/config"; -import { useLocalStorage } from "libs/hooks"; +import { CHAIN_TX_VIEWER, uxConfig } from "libs/config"; import { labels } from "libs/language"; import { getFavoritesFromBackendApi, getOffersByIdAndNoncesFromBackendApi } from "libs/MultiversX"; import { getApi } from "libs/MultiversX/api"; import { DataNftMarketContract } from "libs/MultiversX/dataNftMarket"; import { DataNftMintContract } from "libs/MultiversX/dataNftMint"; -import { OfferType } from "libs/MultiversX/types"; import { convertToLocalString, convertWeiToEsdt, @@ -97,7 +96,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { const marketContract = new DataNftMarketContract(chainID); const { onCopy } = useClipboard(`${window.location.protocol + "//" + window.location.host}/datanfts/marketplace/${tokenId}/offer-${offerId}`); - const [offer, setOffer] = useState(); + const [offer, setOffer] = useState(); const [totalOffers, setTotalOffers] = useState>({}); const [amount, setAmount] = useState(1); const [amountError, setAmountError] = useState(""); @@ -107,9 +106,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { const marketplaceDrawer = "/datanfts/marketplace/market"; const walletDrawer = "/datanfts/wallet"; const { pathname } = useLocation(); - const [previewDataOnDevnetSession] = useLocalStorage(PREVIEW_DATA_ON_DEVNET_SESSION_KEY, null); const [favouriteItems, setFavouriteItems] = React.useState>([]); - const maxBuyLimit = import.meta.env.VITE_MAX_BUY_LIMIT_PER_SFT ? Number(import.meta.env.VITE_MAX_BUY_LIMIT_PER_SFT) : 0; const maxBuyNumber = offer && maxBuyLimit > 0 ? Math.min(maxBuyLimit, offer.quantity) : offer?.quantity; @@ -185,6 +182,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { })(); } }, [offerId, hasPendingTransactions]); + function getTokenDetails() { const apiLink = getApi(chainID); const nftApiLink = `https://${apiLink}/nfts/${tokenId}`; @@ -232,7 +230,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { const _offers = await getOffersByIdAndNoncesFromBackendApi(chainID, identifier, [nonceDec]); setTotalOffers(_offers); - const price = Math.min(..._offers.map((offerArg: any) => offerArg.wanted_token_amount)); + const price = Math.min(..._offers.map((offerArg: any) => offerArg.wantedTokenAmount)); if (price !== Infinity) { setPriceFromApi(price); } else { @@ -287,12 +285,17 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { }; const [searchParams, setSearchParams] = useSearchParams(); + useEffect(() => { if (tokenId && offerId && location.pathname === "/datanfts/marketplace/market") { setSearchParams({ tokenId: tokenId, offerId: String(offerId) }); } }, []); + const isCreatorListing = () => { + return nftData.attributes?.creator === offer?.owner; + }; + return ( {!isLoadingNftData() ? ( @@ -374,7 +377,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { {!offer && getListingText(priceFromApi)} - {offer && getListingText(Number(offer.wanted_token_amount))} + {offer && getListingText(Number(offer.wantedTokenAmount))} {showConnectWallet && ( @@ -485,13 +497,13 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { {marketRequirements && offer ? ( <> {printPrice( - convertWeiToEsdt(new BigNumber(offer.wanted_token_amount), tokenDecimals(offer.wanted_token_identifier)).toNumber(), - getTokenWantedRepresentation(offer.wanted_token_identifier, offer.wanted_token_nonce) + convertWeiToEsdt(new BigNumber(offer.wantedTokenAmount), tokenDecimals(offer.wantedTokenIdentifier)).toNumber(), + getTokenWantedRepresentation(offer.wantedTokenIdentifier, offer.wantedTokenNonce) )}{" "} {itheumPrice && - convertWeiToEsdt(new BigNumber(offer.wanted_token_amount), tokenDecimals(offer.wanted_token_identifier)).toNumber() > 0 + convertWeiToEsdt(new BigNumber(offer.wantedTokenAmount), tokenDecimals(offer.wantedTokenIdentifier)).toNumber() > 0 ? `(~${convertToLocalString( - convertWeiToEsdt(new BigNumber(offer.wanted_token_amount), tokenDecimals(offer.wanted_token_identifier)).toNumber() * + convertWeiToEsdt(new BigNumber(offer.wantedTokenAmount), tokenDecimals(offer.wantedTokenIdentifier)).toNumber() * itheumPrice, 2 )} USD)` @@ -554,7 +566,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { alignItems="center" justifyContent="center"> - You are Owner + You Own this )} @@ -657,7 +669,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { .map((to: any, index: number) => ( - {marketRequirements && getOfferPrice(Number(to.wanted_token_amount))} + {marketRequirements && getOfferPrice(Number(to.wantedTokenAmount))} {to.quantity} @@ -709,6 +721,7 @@ export default function DataNFTDetails(props: DataNFTDetailsProps) { offer={offer} amount={amount} setSessionId={setSessionId} + showCustomMintMsg={isCreatorListing()} /> )} diff --git a/src/pages/DataNFT/DataNFTMarketplaceMultiversX.tsx b/src/pages/DataNFT/DataNFTMarketplaceMultiversX.tsx index ddcca85a..79905e65 100644 --- a/src/pages/DataNFT/DataNFTMarketplaceMultiversX.tsx +++ b/src/pages/DataNFT/DataNFTMarketplaceMultiversX.tsx @@ -46,11 +46,12 @@ import { getOfersAsCollectionFromBackendApi, getOffersCountFromBackendApi, getOf import { getApi, getNetworkProvider, getNftsByIds } from "libs/MultiversX/api"; import { DataNftMarketContract } from "libs/MultiversX/dataNftMarket"; import { DataNftMintContract } from "libs/MultiversX/dataNftMint"; -import { DataNftCollectionType, DataNftMetadataType, OfferType } from "libs/MultiversX/types"; +import { DataNftCollectionType, DataNftMetadataType } from "libs/MultiversX/types"; import { convertWeiToEsdt, createNftId, hexZero, sleep, tokenDecimals } from "libs/utils"; import DataNFTDetails from "pages/DataNFT/DataNFTDetails"; import { useMarketStore } from "store"; import { DataNftCollectionCard } from "./DataNftCollection"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; interface PropsType { tabState: number; // 1 for "Public Marketplace", 2 for "My Data NFTs" @@ -90,7 +91,7 @@ export const Marketplace: FC = ({ tabState }) => { const isApiUp = useMarketStore((state) => state.isApiUp); const isMarketplaceApiUp = useMarketStore((state) => state.isMarketplaceApiUp); - const [offerForDrawer, setOfferForDrawer] = useState(); + const [offerForDrawer, setOfferForDrawer] = useState(); const { isOpen: isOpenDataNftDetails, onOpen: onOpenDataNftDetails, onClose: onCloseDataNftDetails } = useDisclosure(); const [myListedCount, setMyListedCount] = useState(0); const [publicMarketCount, setPublicMarketCount] = useState(0); @@ -125,7 +126,7 @@ export const Marketplace: FC = ({ tabState }) => { useEffect(() => { (async () => { - const _marketFreezedNonces = await mintContract.getSftsFrozenForAddress(marketContract.dataNftMarketContractAddress); + const _marketFreezedNonces = await mintContract.getSftsFrozenForAddress(marketContract.contract.getContractAddress().bech32()); setMarketFreezedNonces(_marketFreezedNonces); })(); }, []); @@ -154,7 +155,7 @@ export const Marketplace: FC = ({ tabState }) => { let _numberOfOffers = 0; if (tabState === 1) { // global offers - _numberOfOffers = await marketContract.viewNumberOfOffers(); + _numberOfOffers = (await marketContract.viewNumberOfOffers()) ?? 0; } else { // offers of User _numberOfOffers = await marketContract.viewUserTotalOffers(address); @@ -177,7 +178,7 @@ export const Marketplace: FC = ({ tabState }) => { // start loading offers updateLoadingOffers(true); - let _offers: OfferType[] = []; + let _offers: Offer[] = []; const start = pageIndex * pageSize; if (isApiUp && isMarketplaceApiUp) { _offers = await getOffersFromBackendApi(chainID, start, pageSize, tabState === 1 ? undefined : address); @@ -188,7 +189,7 @@ export const Marketplace: FC = ({ tabState }) => { updateOffers(_offers); setNftMetadatasLoading(true); - const nftIds = _offers.map((offer) => createNftId(offer.offered_token_identifier, offer.offered_token_nonce)); + const nftIds = _offers.map((offer) => createNftId(offer.offeredTokenIdentifier, offer.offeredTokenNonce)); const _nfts = await getNftsByIds(nftIds, chainID); const _metadatas: DataNftMetadataType[] = []; for (let i = 0; i < _nfts.length; i++) { @@ -303,7 +304,7 @@ export const Marketplace: FC = ({ tabState }) => { Data NFT Marketplace - Explore and discover new Data NFTs direct from Data Creators and peer-to-peer traders + Explore and discover new Data NFTs direct from Data Creators and peer-to-peer data traders @@ -426,7 +427,7 @@ export const Marketplace: FC = ({ tabState }) => { = ({ tabState }) => { title={offer.title} description={offer.description} floorPrice={convertWeiToEsdt( - offer.minOffer.wanted_token_amount as BigNumber.Value, - tokenDecimals(offer.minOffer.wanted_token_identifier) + offer.minOffer.wantedTokenAmount as BigNumber.Value, + tokenDecimals(offer.minOffer.wantedTokenIdentifier) ).toNumber()} listed={offer.minOffer?.quantity} openNftDetailsDrawer={openNftDetailsModal} @@ -474,7 +475,7 @@ export const Marketplace: FC = ({ tabState }) => { = ({ tabState }) => { diff --git a/src/pages/DataNFT/MyDataNFTsMultiversX.tsx b/src/pages/DataNFT/MyDataNFTsMultiversX.tsx index 2acda9bd..59795729 100644 --- a/src/pages/DataNFT/MyDataNFTsMultiversX.tsx +++ b/src/pages/DataNFT/MyDataNFTsMultiversX.tsx @@ -170,7 +170,7 @@ export default function MyDataNFTsMx({ tabState }: { tabState: number }) { Data NFT Wallet - Below are the Data NFTs you created or purchased on the current blockchain + Below are the Data NFTs you created or purchased from the peer-to-peer Data NFT Marketplace diff --git a/src/pages/GetWhitelist/LandingPage/LandingPage.tsx b/src/pages/GetWhitelist/LandingPage/LandingPage.tsx index 85fd8eb9..98316470 100644 --- a/src/pages/GetWhitelist/LandingPage/LandingPage.tsx +++ b/src/pages/GetWhitelist/LandingPage/LandingPage.tsx @@ -42,8 +42,8 @@ export const LandingPage: React.FC = () => { It’s time to own and trade your data. - Whether you’re a data creator, researcher, content creator, analyst, gamer, or a pioneering project - you have the power to redefine the value of - your data. Transform your unique datasets into a new asset class by minting your very own Data NFTs. + Whether you’re a data creator, musician, researcher, content creator, analyst, gamer, or a pioneering project - you have the power to redefine the + value of your data. Transform your unique datasets into a new asset class by minting your very own Data NFTs. Don’t just be a part of the change, lead it. diff --git a/src/pages/GetWhitelist/TrendingData/TrendingData.tsx b/src/pages/GetWhitelist/TrendingData/TrendingData.tsx index 50c6827b..215d81d4 100644 --- a/src/pages/GetWhitelist/TrendingData/TrendingData.tsx +++ b/src/pages/GetWhitelist/TrendingData/TrendingData.tsx @@ -3,11 +3,20 @@ import { Box, Flex, Text, useColorMode } from "@chakra-ui/react"; import bubbleImage from "assets/img/whitelist/BubbleImage.png"; import infographicsImage from "assets/img/whitelist/InfographicsImage.png"; import trailblazerImage from "assets/img/whitelist/TrailblazerImage.png"; +import nftunesImage from "assets/img/whitelist/NFTuneApp.png"; +import timecapsuleImage from "assets/img/whitelist/TimeCapsuleApp.png"; import { TrendingDataCards } from "./components/TrendingDataCards"; const cardContent = [ { id: 1, + headerImage: nftunesImage, + title: "NF-Tunes", + description: "Empowering Indie musicians to engage with a fresh fan community and discover alternative avenues for music distribution", + url: "https://explorer.itheum.io/nftunes", + }, + { + id: 2, headerImage: infographicsImage, title: "MultiversX Infographics", description: @@ -15,7 +24,7 @@ const cardContent = [ url: "https://explorer.itheum.io/multiversx-infographics", }, { - id: 2, + id: 3, headerImage: bubbleImage, title: "MultiversX ESDT Bubbles", description: @@ -23,12 +32,19 @@ const cardContent = [ url: "https://explorer.itheum.io/multiversx-bubbles", }, { - id: 3, + id: 4, headerImage: trailblazerImage, title: "Trailblazer", - description: "Hardcore community members unlock Project Alpha by owning their favourite project's TrailBlazer Data NFTs.", + description: "Hardcore community members unlock Project Alpha by owning their favorite project's TrailBlazer Data NFTs.", url: "https://explorer.itheum.io/project-trailblazer", }, + { + id: 5, + headerImage: timecapsuleImage, + title: "Time Capsule", + description: "Capture, archive, and relive historic social media events through media, preserving memories for future generations.", + url: "https://explorer.itheum.io/timecapsule", + }, ]; export const TrendingData: React.FC = () => { const { colorMode } = useColorMode(); diff --git a/src/pages/Home/HomeMultiversX.tsx b/src/pages/Home/HomeMultiversX.tsx index f225cc94..e0db4af4 100644 --- a/src/pages/Home/HomeMultiversX.tsx +++ b/src/pages/Home/HomeMultiversX.tsx @@ -421,7 +421,7 @@ export default function HomeMultiversX({ - Data DEX 101 Guides + Get Started diff --git a/src/pages/LandingPage/index.tsx b/src/pages/LandingPage/index.tsx index c30137ad..334f48d2 100644 --- a/src/pages/LandingPage/index.tsx +++ b/src/pages/LandingPage/index.tsx @@ -40,7 +40,7 @@ const LandingPage = () => { your data {" "} - in the Web3 Multiverse + as Data NFTs @@ -63,7 +63,7 @@ const LandingPage = () => { - Data DEX 101 Guides + Get Started diff --git a/src/pages/Profile/components/DataCreatorTabs.tsx b/src/pages/Profile/components/DataCreatorTabs.tsx index b38f6aca..d1561995 100644 --- a/src/pages/Profile/components/DataCreatorTabs.tsx +++ b/src/pages/Profile/components/DataCreatorTabs.tsx @@ -38,10 +38,11 @@ import { getOffersCountFromBackendApi } from "../../../libs/MultiversX"; import { getNftsByIds } from "../../../libs/MultiversX/api"; import { DataNftMarketContract } from "../../../libs/MultiversX/dataNftMarket"; import { DataNftMintContract } from "../../../libs/MultiversX/dataNftMint"; -import { createDataNftType, DataNftMetadataType, DataNftType, OfferType } from "../../../libs/MultiversX/types"; +import { createDataNftType, DataNftMetadataType, DataNftType } from "../../../libs/MultiversX/types"; import { backendApi, createNftId, sleep } from "../../../libs/utils"; import { useMarketStore } from "../../../store"; import DataNFTDetails from "../../DataNFT/DataNFTDetails"; +import { Offer } from "@itheum/sdk-mx-data-nft/out"; interface PropsType { tabState: number; @@ -75,7 +76,7 @@ export const DataCreatorTabs: React.FC = ({ tabState }) => { // const marketRequirements = useMarketStore((state) => state.marketRequirements); const [isLoadingSecond, setIsLoadingSecond] = useState(false); - const [offerForDrawer, setOfferForDrawer] = useState(); + const [offerForDrawer, setOfferForDrawer] = useState(); const [dataNftForDrawer, setDataNftForDrawer] = useState(); const [myListedCount, setMyListedCount] = useState(0); @@ -216,7 +217,7 @@ export const DataCreatorTabs: React.FC = ({ tabState }) => { updateOffers(_offers); // - const nftIds = _offers.map((offer) => createNftId(offer.offered_token_identifier, offer.offered_token_nonce)); + const nftIds = _offers.map((offer) => createNftId(offer.offeredTokenIdentifier, offer.offeredTokenNonce)); const _nfts = await getNftsByIds(nftIds, chainID); const _metadatas: DataNftMetadataType[] = []; for (let i = 0; i < _nfts.length; i++) { @@ -372,7 +373,7 @@ export const DataCreatorTabs: React.FC = ({ tabState }) => { diff --git a/src/store/market.ts b/src/store/market.ts index f43ee21f..5d9ac114 100644 --- a/src/store/market.ts +++ b/src/store/market.ts @@ -1,6 +1,5 @@ -import { MarketplaceRequirements } from "@itheum/sdk-mx-data-nft/out"; +import { MarketplaceRequirements, Offer } from "@itheum/sdk-mx-data-nft/out"; import { create } from "zustand"; -import { OfferType } from "libs/MultiversX/types"; type State = { itheumPrice: number; @@ -10,7 +9,7 @@ type State = { isApiUp: boolean; isMarketplaceApiUp: boolean; - offers: Array; + offers: Array; loadingOffers: boolean; pageCount: number; }; @@ -53,7 +52,7 @@ export const useMarketStore = create((set) => ({ pageCount: 1, updateIsApiUp: (value: boolean) => set((state) => ({ ...state, isApiUp: value })), updateIsMarketplaceApiUp: (value: boolean) => set((state) => ({ ...state, isMarketplaceApiUp: value })), - updateOffers: (value: Array) => set((state) => ({ ...state, offers: value })), + updateOffers: (value: Array) => set((state) => ({ ...state, offers: value })), updateLoadingOffers: (value: boolean) => set((state) => ({ ...state, loadingOffers: value })), updatePageCount: (value: number) => set((state) => ({ ...state, pageCount: value })), }));