lushdog@outlook.com 1 月之前
父节点
当前提交
d61a4ca96e

+ 3 - 1
package.json

@@ -17,12 +17,14 @@
 		"@solana/buffer-layout": "^4.0.1",
 		"@solana/spl-token": "^0.4.14",
 		"@solana/web3.js": "^1.98.4",
+		"@types/bn.js": "^5.2.0",
 		"antd": "^6.0.1",
 		"bn.js": "^5.2.2",
+		"bs58": "^6.0.0",
 		"decimal.js": "^10.6.0",
 		"ky": "^1.14.2",
 		"lodash-es": "^4.17.22",
-		"next": "16.0.7",
+		"next": "16.0.10",
 		"react": "19.2.0",
 		"react-dom": "19.2.0",
 		"sha256": "link:@noble/hashes/sha256"

+ 141 - 117
pnpm-lock.yaml

@@ -26,12 +26,18 @@ importers:
       '@solana/web3.js':
         specifier: ^1.98.4
         version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)
+      '@types/bn.js':
+        specifier: ^5.2.0
+        version: 5.2.0
       antd:
         specifier: ^6.0.1
         version: 6.1.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       bn.js:
         specifier: ^5.2.2
         version: 5.2.2
+      bs58:
+        specifier: ^6.0.0
+        version: 6.0.0
       decimal.js:
         specifier: ^10.6.0
         version: 10.6.0
@@ -42,8 +48,8 @@ importers:
         specifier: ^4.17.22
         version: 4.17.22
       next:
-        specifier: 16.0.7
-        version: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        specifier: 16.0.10
+        version: 16.0.10(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       react:
         specifier: 19.2.0
         version: 19.2.0
@@ -209,13 +215,13 @@ packages:
       '@solana/web3.js': ^1.69.0
 
   '@emnapi/core@1.8.1':
-    resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
+    resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@emnapi/core/-/core-1.8.1.tgz}
 
   '@emnapi/runtime@1.8.1':
-    resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+    resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@emnapi/runtime/-/runtime-1.8.1.tgz}
 
   '@emnapi/wasi-threads@1.1.0':
-    resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+    resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz}
 
   '@emotion/hash@0.8.0':
     resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
@@ -282,134 +288,134 @@ packages:
     engines: {node: '>=18'}
 
   '@img/sharp-darwin-arm64@0.34.5':
-    resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+    resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [arm64]
     os: [darwin]
 
   '@img/sharp-darwin-x64@0.34.5':
-    resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+    resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [x64]
     os: [darwin]
 
   '@img/sharp-libvips-darwin-arm64@1.2.4':
-    resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+    resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz}
     cpu: [arm64]
     os: [darwin]
 
   '@img/sharp-libvips-darwin-x64@1.2.4':
-    resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+    resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz}
     cpu: [x64]
     os: [darwin]
 
   '@img/sharp-libvips-linux-arm64@1.2.4':
-    resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+    resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz}
     cpu: [arm64]
     os: [linux]
 
   '@img/sharp-libvips-linux-arm@1.2.4':
-    resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+    resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz}
     cpu: [arm]
     os: [linux]
 
   '@img/sharp-libvips-linux-ppc64@1.2.4':
-    resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+    resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz}
     cpu: [ppc64]
     os: [linux]
 
   '@img/sharp-libvips-linux-riscv64@1.2.4':
-    resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+    resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz}
     cpu: [riscv64]
     os: [linux]
 
   '@img/sharp-libvips-linux-s390x@1.2.4':
-    resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+    resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz}
     cpu: [s390x]
     os: [linux]
 
   '@img/sharp-libvips-linux-x64@1.2.4':
-    resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+    resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz}
     cpu: [x64]
     os: [linux]
 
   '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
-    resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+    resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz}
     cpu: [arm64]
     os: [linux]
 
   '@img/sharp-libvips-linuxmusl-x64@1.2.4':
-    resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+    resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz}
     cpu: [x64]
     os: [linux]
 
   '@img/sharp-linux-arm64@0.34.5':
-    resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+    resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [arm64]
     os: [linux]
 
   '@img/sharp-linux-arm@0.34.5':
-    resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+    resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [arm]
     os: [linux]
 
   '@img/sharp-linux-ppc64@0.34.5':
-    resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+    resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [ppc64]
     os: [linux]
 
   '@img/sharp-linux-riscv64@0.34.5':
-    resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+    resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [riscv64]
     os: [linux]
 
   '@img/sharp-linux-s390x@0.34.5':
-    resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+    resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [s390x]
     os: [linux]
 
   '@img/sharp-linux-x64@0.34.5':
-    resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+    resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [x64]
     os: [linux]
 
   '@img/sharp-linuxmusl-arm64@0.34.5':
-    resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+    resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [arm64]
     os: [linux]
 
   '@img/sharp-linuxmusl-x64@0.34.5':
-    resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+    resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [x64]
     os: [linux]
 
   '@img/sharp-wasm32@0.34.5':
-    resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+    resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [wasm32]
 
   '@img/sharp-win32-arm64@0.34.5':
-    resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+    resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [arm64]
     os: [win32]
 
   '@img/sharp-win32-ia32@0.34.5':
-    resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+    resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [ia32]
     os: [win32]
 
   '@img/sharp-win32-x64@0.34.5':
-    resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+    resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
     cpu: [x64]
     os: [win32]
@@ -431,58 +437,58 @@ packages:
     resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
 
   '@napi-rs/wasm-runtime@0.2.12':
-    resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
+    resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz}
 
-  '@next/env@16.0.7':
-    resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==}
+  '@next/env@16.0.10':
+    resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==}
 
   '@next/eslint-plugin-next@16.0.7':
     resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==}
 
-  '@next/swc-darwin-arm64@16.0.7':
-    resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==}
+  '@next/swc-darwin-arm64@16.0.10':
+    resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [darwin]
 
-  '@next/swc-darwin-x64@16.0.7':
-    resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==}
+  '@next/swc-darwin-x64@16.0.10':
+    resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [darwin]
 
-  '@next/swc-linux-arm64-gnu@16.0.7':
-    resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==}
+  '@next/swc-linux-arm64-gnu@16.0.10':
+    resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
 
-  '@next/swc-linux-arm64-musl@16.0.7':
-    resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==}
+  '@next/swc-linux-arm64-musl@16.0.10':
+    resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
 
-  '@next/swc-linux-x64-gnu@16.0.7':
-    resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==}
+  '@next/swc-linux-x64-gnu@16.0.10':
+    resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
 
-  '@next/swc-linux-x64-musl@16.0.7':
-    resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==}
+  '@next/swc-linux-x64-musl@16.0.10':
+    resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
 
-  '@next/swc-win32-arm64-msvc@16.0.7':
-    resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==}
+  '@next/swc-win32-arm64-msvc@16.0.10':
+    resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [win32]
 
-  '@next/swc-win32-x64-msvc@16.0.7':
-    resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==}
+  '@next/swc-win32-x64-msvc@16.0.10':
+    resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [win32]
@@ -892,61 +898,61 @@ packages:
     resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
 
   '@tailwindcss/oxide-android-arm64@4.1.18':
-    resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
+    resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [android]
 
   '@tailwindcss/oxide-darwin-arm64@4.1.18':
-    resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
+    resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [darwin]
 
   '@tailwindcss/oxide-darwin-x64@4.1.18':
-    resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
+    resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [darwin]
 
   '@tailwindcss/oxide-freebsd-x64@4.1.18':
-    resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
+    resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [freebsd]
 
   '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
-    resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
+    resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm]
     os: [linux]
 
   '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
-    resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
+    resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
 
   '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
-    resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
+    resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
 
   '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
-    resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
+    resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
 
   '@tailwindcss/oxide-linux-x64-musl@4.1.18':
-    resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
+    resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
 
   '@tailwindcss/oxide-wasm32-wasi@4.1.18':
-    resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
+    resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz}
     engines: {node: '>=14.0.0'}
     cpu: [wasm32]
     bundledDependencies:
@@ -958,13 +964,13 @@ packages:
       - tslib
 
   '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
-    resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
+    resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [win32]
 
   '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
-    resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
+    resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [win32]
@@ -977,7 +983,10 @@ packages:
     resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
 
   '@tybys/wasm-util@0.10.1':
-    resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+    resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@tybys/wasm-util/-/wasm-util-0.10.1.tgz}
+
+  '@types/bn.js@5.2.0':
+    resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@types/bn.js/-/bn.js-5.2.0.tgz}
 
   '@types/connect@3.4.38':
     resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
@@ -1074,97 +1083,97 @@ packages:
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
-    resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
+    resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz}
     cpu: [arm]
     os: [android]
 
   '@unrs/resolver-binding-android-arm64@1.11.1':
-    resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
+    resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz}
     cpu: [arm64]
     os: [android]
 
   '@unrs/resolver-binding-darwin-arm64@1.11.1':
-    resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
+    resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz}
     cpu: [arm64]
     os: [darwin]
 
   '@unrs/resolver-binding-darwin-x64@1.11.1':
-    resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
+    resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz}
     cpu: [x64]
     os: [darwin]
 
   '@unrs/resolver-binding-freebsd-x64@1.11.1':
-    resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
+    resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz}
     cpu: [x64]
     os: [freebsd]
 
   '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
-    resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
+    resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz}
     cpu: [arm]
     os: [linux]
 
   '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
-    resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
+    resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz}
     cpu: [arm]
     os: [linux]
 
   '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
-    resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
+    resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz}
     cpu: [arm64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
-    resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
+    resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz}
     cpu: [arm64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
-    resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
+    resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz}
     cpu: [ppc64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
-    resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
+    resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz}
     cpu: [riscv64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
-    resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
+    resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz}
     cpu: [riscv64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
-    resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
+    resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz}
     cpu: [s390x]
     os: [linux]
 
   '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
-    resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
+    resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz}
     cpu: [x64]
     os: [linux]
 
   '@unrs/resolver-binding-linux-x64-musl@1.11.1':
-    resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
+    resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz}
     cpu: [x64]
     os: [linux]
 
   '@unrs/resolver-binding-wasm32-wasi@1.11.1':
-    resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
+    resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz}
     engines: {node: '>=14.0.0'}
     cpu: [wasm32]
 
   '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
-    resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
+    resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz}
     cpu: [arm64]
     os: [win32]
 
   '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
-    resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
+    resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz}
     cpu: [ia32]
     os: [win32]
 
   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
-    resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
+    resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz}
     cpu: [x64]
     os: [win32]
 
@@ -1259,6 +1268,9 @@ packages:
   base-x@3.0.11:
     resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==}
 
+  base-x@5.0.1:
+    resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==}
+
   base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
 
@@ -1300,6 +1312,9 @@ packages:
   bs58@4.0.1:
     resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
 
+  bs58@6.0.0:
+    resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==}
+
   buffer-layout@1.2.2:
     resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==}
     engines: {node: '>=4.5'}
@@ -1308,7 +1323,7 @@ packages:
     resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
 
   bufferutil@4.1.0:
-    resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==}
+    resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/bufferutil/-/bufferutil-4.1.0.tgz}
     engines: {node: '>=6.14.2'}
 
   call-bind-apply-helpers@1.0.2:
@@ -1650,7 +1665,7 @@ packages:
     resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==}
 
   fastestsmallesttextencoderdecoder@1.0.22:
-    resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==}
+    resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz}
 
   fastq@1.20.1:
     resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
@@ -1998,67 +2013,67 @@ packages:
     engines: {node: '>= 0.8.0'}
 
   lightningcss-android-arm64@1.30.2:
-    resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+    resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [android]
 
   lightningcss-darwin-arm64@1.30.2:
-    resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+    resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [darwin]
 
   lightningcss-darwin-x64@1.30.2:
-    resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+    resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [darwin]
 
   lightningcss-freebsd-x64@1.30.2:
-    resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+    resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [freebsd]
 
   lightningcss-linux-arm-gnueabihf@1.30.2:
-    resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+    resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm]
     os: [linux]
 
   lightningcss-linux-arm64-gnu@1.30.2:
-    resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+    resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
 
   lightningcss-linux-arm64-musl@1.30.2:
-    resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+    resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
 
   lightningcss-linux-x64-gnu@1.30.2:
-    resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+    resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
 
   lightningcss-linux-x64-musl@1.30.2:
-    resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+    resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
 
   lightningcss-win32-arm64-msvc@1.30.2:
-    resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+    resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [win32]
 
   lightningcss-win32-x64-msvc@1.30.2:
-    resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+    resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [win32]
@@ -2125,10 +2140,9 @@ packages:
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
-  next@16.0.7:
-    resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==}
+  next@16.0.10:
+    resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==}
     engines: {node: '>=20.9.0'}
-    deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.
     hasBin: true
     peerDependencies:
       '@opentelemetry/api': ^1.1.0
@@ -2363,7 +2377,7 @@ packages:
     engines: {node: '>= 0.4'}
 
   sharp@0.34.5:
-    resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+    resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/sharp/-/sharp-0.34.5.tgz}
     engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
 
   shebang-command@2.0.0:
@@ -2564,7 +2578,7 @@ packages:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
 
   utf-8-validate@5.0.10:
-    resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
+    resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==, tarball: https://pkgs.d.xiaomi.net:443/artifactory/api/npm/mi-npm/utf-8-validate/-/utf-8-validate-5.0.10.tgz}
     engines: {node: '>=6.14.2'}
 
   uuid@8.3.2:
@@ -3023,34 +3037,34 @@ snapshots:
       '@tybys/wasm-util': 0.10.1
     optional: true
 
-  '@next/env@16.0.7': {}
+  '@next/env@16.0.10': {}
 
   '@next/eslint-plugin-next@16.0.7':
     dependencies:
       fast-glob: 3.3.1
 
-  '@next/swc-darwin-arm64@16.0.7':
+  '@next/swc-darwin-arm64@16.0.10':
     optional: true
 
-  '@next/swc-darwin-x64@16.0.7':
+  '@next/swc-darwin-x64@16.0.10':
     optional: true
 
-  '@next/swc-linux-arm64-gnu@16.0.7':
+  '@next/swc-linux-arm64-gnu@16.0.10':
     optional: true
 
-  '@next/swc-linux-arm64-musl@16.0.7':
+  '@next/swc-linux-arm64-musl@16.0.10':
     optional: true
 
-  '@next/swc-linux-x64-gnu@16.0.7':
+  '@next/swc-linux-x64-gnu@16.0.10':
     optional: true
 
-  '@next/swc-linux-x64-musl@16.0.7':
+  '@next/swc-linux-x64-musl@16.0.10':
     optional: true
 
-  '@next/swc-win32-arm64-msvc@16.0.7':
+  '@next/swc-win32-arm64-msvc@16.0.10':
     optional: true
 
-  '@next/swc-win32-x64-msvc@16.0.7':
+  '@next/swc-win32-x64-msvc@16.0.10':
     optional: true
 
   '@noble/curves@1.9.7':
@@ -3644,6 +3658,10 @@ snapshots:
       tslib: 2.8.1
     optional: true
 
+  '@types/bn.js@5.2.0':
+    dependencies:
+      '@types/node': 20.19.27
+
   '@types/connect@3.4.38':
     dependencies:
       '@types/node': 20.19.27
@@ -3995,6 +4013,8 @@ snapshots:
     dependencies:
       safe-buffer: 5.2.1
 
+  base-x@5.0.1: {}
+
   base64-js@1.5.1: {}
 
   baseline-browser-mapping@2.9.11: {}
@@ -4042,6 +4062,10 @@ snapshots:
     dependencies:
       base-x: 3.0.11
 
+  bs58@6.0.0:
+    dependencies:
+      base-x: 5.0.1
+
   buffer-layout@1.2.2: {}
 
   buffer@6.0.3:
@@ -4975,9 +4999,9 @@ snapshots:
 
   natural-compare@1.4.0: {}
 
-  next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
+  next@16.0.10(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
     dependencies:
-      '@next/env': 16.0.7
+      '@next/env': 16.0.10
       '@swc/helpers': 0.5.15
       caniuse-lite: 1.0.30001762
       postcss: 8.4.31
@@ -4985,14 +5009,14 @@ snapshots:
       react-dom: 19.2.0(react@19.2.0)
       styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.0)
     optionalDependencies:
-      '@next/swc-darwin-arm64': 16.0.7
-      '@next/swc-darwin-x64': 16.0.7
-      '@next/swc-linux-arm64-gnu': 16.0.7
-      '@next/swc-linux-arm64-musl': 16.0.7
-      '@next/swc-linux-x64-gnu': 16.0.7
-      '@next/swc-linux-x64-musl': 16.0.7
-      '@next/swc-win32-arm64-msvc': 16.0.7
-      '@next/swc-win32-x64-msvc': 16.0.7
+      '@next/swc-darwin-arm64': 16.0.10
+      '@next/swc-darwin-x64': 16.0.10
+      '@next/swc-linux-arm64-gnu': 16.0.10
+      '@next/swc-linux-arm64-musl': 16.0.10
+      '@next/swc-linux-x64-gnu': 16.0.10
+      '@next/swc-linux-x64-musl': 16.0.10
+      '@next/swc-win32-arm64-msvc': 16.0.10
+      '@next/swc-win32-x64-msvc': 16.0.10
       sharp: 0.34.5
     transitivePeerDependencies:
       - '@babel/core'

+ 433 - 0
src/app/api/lp-copy/route.ts

@@ -0,0 +1,433 @@
+import { NextRequest, NextResponse } from 'next/server'
+import { Keypair, PublicKey, VersionedTransaction } from '@solana/web3.js'
+import BN from 'bn.js'
+import { Decimal } from 'decimal.js'
+import bs58 from 'bs58'
+import { chain } from '@/lib/config'
+
+export async function POST(request: NextRequest) {
+	try {
+		const body = await request.json()
+		const { positionAddress, maxUsdValue } = body
+
+		if (!positionAddress) {
+			return NextResponse.json(
+				{ error: 'Position address is required' },
+				{ status: 400 }
+			)
+		}
+
+		if (!maxUsdValue || maxUsdValue <= 0) {
+			return NextResponse.json(
+				{ error: 'Max USD value must be greater than 0' },
+				{ status: 400 }
+			)
+		}
+
+		const detailData = await fetch(
+			`https://api2.byreal.io/byreal/api/dex/v2/position/detail?address=${positionAddress}`
+		).then((res) => res.json())
+
+		const nftMint = new PublicKey(detailData.result.data.nftMintAddress)
+		// 获取 position 信息
+		const positionInfo = await chain.getPositionInfoByNftMint(nftMint)
+
+		if (!positionInfo) {
+			return NextResponse.json({ error: 'Position not found' }, { status: 404 })
+		}
+
+		const { rawPoolInfo, priceLower, priceUpper } = positionInfo
+		const poolInfo = rawPoolInfo
+
+		// 使用 currentPrice (A/B 价格) 来计算 token 的 USD 价格
+		// currentPrice 是 tokenA / tokenB 的比率
+		const currentPrice = poolInfo.currentPrice
+
+		// 稳定币地址
+		const USDC_ADDRESS = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
+		const USDT_ADDRESS = 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB'
+
+		const tokenAAddress = poolInfo.mintA.toBase58()
+		const tokenBAddress = poolInfo.mintB.toBase58()
+
+		// 判断哪个 token 是稳定币
+		const isTokenAStable =
+			tokenAAddress === USDC_ADDRESS || tokenAAddress === USDT_ADDRESS
+		const isTokenBStable =
+			tokenBAddress === USDC_ADDRESS || tokenBAddress === USDT_ADDRESS
+
+		// 计算 token 的 USD 价格
+		let tokenAPriceUsd: number
+		let tokenBPriceUsd: number
+
+		if (isTokenBStable) {
+			// tokenB 是稳定币,价格为 1 USD
+			tokenBPriceUsd = 1
+			// tokenA 的价格 = currentPrice (A/B) * tokenB 价格
+			tokenAPriceUsd = currentPrice
+		} else if (isTokenAStable) {
+			// tokenA 是稳定币,价格为 1 USD
+			tokenAPriceUsd = 1
+			// tokenB 的价格 = 1 / currentPrice (因为 currentPrice = A/B)
+			tokenBPriceUsd = 1 / currentPrice
+		} else {
+			// 如果都不是稳定币,假设其中一个的价格为 1(简化处理)
+			// 或者可以从价格 API 获取实际价格
+			// 这里假设 tokenB 价格为 1,tokenA 价格为 currentPrice
+			tokenBPriceUsd = 1
+			tokenAPriceUsd = currentPrice
+		}
+
+		console.log('tokenAPriceUsd', tokenAPriceUsd)
+		console.log('tokenBPriceUsd', tokenBPriceUsd)
+
+		// 计算比例,使得总价值不超过 maxUsdValue
+		// 使用 position 的 tickLower 和 tickUpper
+		const tickLower = positionInfo.rawPositionInfo.tickLower
+		const tickUpper = positionInfo.rawPositionInfo.tickUpper
+
+		// 计算需要投入的金额
+		// 假设使用较小的 token 作为 base
+		const useTokenAAsBase = tokenAPriceUsd <= tokenBPriceUsd
+		const base = useTokenAAsBase ? 'MintA' : 'MintB'
+
+		// 计算 baseAmount,使得总价值尽可能接近 maxUsdValue
+		// 使用迭代方法精确计算,确保总价值接近但不超过 maxUsdValue
+		const midPrice = priceLower.add(priceUpper).div(2)
+
+		let baseAmount: BN
+		let otherAmountMax: BN
+
+		// 使用二分法或迭代方法找到最接近 maxUsdValue 的金额
+		// 目标值设为接近 100%,尽可能接近最大值
+		// 由于 slippage 和实际价格曲线的影响,最终值会略低于 maxUsdValue
+		const targetValue = maxUsdValue * 0.995 // 99.5%,更接近最大值
+
+		if (base === 'MintA') {
+			// 使用 tokenA 作为 base
+			// 估算:总价值 ≈ baseAmount * (tokenAPriceUsd + midPrice * tokenBPriceUsd)
+			const estimatedPricePerBase =
+				tokenAPriceUsd + midPrice.toNumber() * tokenBPriceUsd
+
+			// 使用更精确的计算,考虑实际的价格曲线
+			// 迭代调整 baseAmount 直到总价值接近 targetValue
+			let low = new BN(0)
+			let high = new BN(
+				Math.ceil(
+					(targetValue / estimatedPricePerBase) *
+						10 ** poolInfo.mintDecimalsA *
+						1.5
+				)
+			)
+			let bestBaseAmount = new BN(0)
+			let bestValue = 0
+
+			// 二分查找最接近目标值的 baseAmount,增加迭代次数以提高精度
+			for (let i = 0; i < 30; i++) {
+				const mid = low.add(high).div(new BN(2))
+				if (mid.eq(low) || mid.eq(high)) break
+
+				const testBaseAmount = mid
+				const testOtherAmount = chain.getAmountBFromAmountA({
+					priceLower,
+					priceUpper,
+					amountA: testBaseAmount,
+					poolInfo,
+				})
+
+				const testUiAmountA = new Decimal(testBaseAmount.toString()).div(
+					10 ** poolInfo.mintDecimalsA
+				)
+				const testUiAmountB = new Decimal(testOtherAmount.toString()).div(
+					10 ** poolInfo.mintDecimalsB
+				)
+				const testValue =
+					testUiAmountA.toNumber() * tokenAPriceUsd +
+					testUiAmountB.toNumber() * tokenBPriceUsd
+
+				if (testValue <= targetValue && testValue > bestValue) {
+					bestValue = testValue
+					bestBaseAmount = testBaseAmount
+				}
+
+				if (testValue > targetValue) {
+					high = mid
+				} else {
+					low = mid
+				}
+			}
+
+			baseAmount = bestBaseAmount.gt(new BN(0)) ? bestBaseAmount : low
+
+			// 计算需要的 tokenB 数量(实际需要的,未加 slippage)
+			const otherAmountNeeded = chain.getAmountBFromAmountA({
+				priceLower,
+				priceUpper,
+				amountA: baseAmount,
+				poolInfo,
+			})
+
+			// 添加 2% slippage 作为 otherAmountMax(允许的最大值)
+			otherAmountMax = otherAmountNeeded.mul(new BN(10200)).div(new BN(10000))
+		} else {
+			// 使用 tokenB 作为 base
+			const estimatedPricePerBase =
+				tokenBPriceUsd + (1 / midPrice.toNumber()) * tokenAPriceUsd
+
+			// 迭代调整 baseAmount
+			let low = new BN(0)
+			let high = new BN(
+				Math.ceil(
+					(targetValue / estimatedPricePerBase) *
+						10 ** poolInfo.mintDecimalsB *
+						1.5
+				)
+			)
+			let bestBaseAmount = new BN(0)
+			let bestValue = 0
+
+			// 二分查找,增加迭代次数以提高精度
+			for (let i = 0; i < 30; i++) {
+				const mid = low.add(high).div(new BN(2))
+				if (mid.eq(low) || mid.eq(high)) break
+
+				const testBaseAmount = mid
+				const testOtherAmount = chain.getAmountAFromAmountB({
+					priceLower,
+					priceUpper,
+					amountB: testBaseAmount,
+					poolInfo,
+				})
+
+				const testUiAmountA = new Decimal(testOtherAmount.toString()).div(
+					10 ** poolInfo.mintDecimalsA
+				)
+				const testUiAmountB = new Decimal(testBaseAmount.toString()).div(
+					10 ** poolInfo.mintDecimalsB
+				)
+				const testValue =
+					testUiAmountA.toNumber() * tokenAPriceUsd +
+					testUiAmountB.toNumber() * tokenBPriceUsd
+
+				if (testValue <= targetValue && testValue > bestValue) {
+					bestValue = testValue
+					bestBaseAmount = testBaseAmount
+				}
+
+				if (testValue > targetValue) {
+					high = mid
+				} else {
+					low = mid
+				}
+			}
+
+			baseAmount = bestBaseAmount.gt(new BN(0)) ? bestBaseAmount : low
+
+			// 计算需要的 tokenA 数量(实际需要的,未加 slippage)
+			const otherAmountNeeded = chain.getAmountAFromAmountB({
+				priceLower,
+				priceUpper,
+				amountB: baseAmount,
+				poolInfo,
+			})
+
+			// 添加 2% slippage 作为 otherAmountMax(允许的最大值)
+			otherAmountMax = otherAmountNeeded.mul(new BN(10200)).div(new BN(10000))
+		}
+
+		// 计算最终总价值(使用实际投入的金额,而不是加了 slippage 的 otherAmountMax)
+		// 实际投入的 otherAmount 是 otherAmountMax / 1.02(因为 otherAmountMax 包含了 2% slippage)
+		const actualOtherAmount = otherAmountMax
+			.mul(new BN(10000))
+			.div(new BN(10200))
+
+		const uiAmountA =
+			base === 'MintA'
+				? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsA)
+				: new Decimal(actualOtherAmount.toString()).div(
+						10 ** poolInfo.mintDecimalsA
+					)
+		const uiAmountB =
+			base === 'MintB'
+				? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsB)
+				: new Decimal(actualOtherAmount.toString()).div(
+						10 ** poolInfo.mintDecimalsB
+					)
+
+		let totalValue =
+			uiAmountA.toNumber() * tokenAPriceUsd +
+			uiAmountB.toNumber() * tokenBPriceUsd
+
+		// 如果总价值仍然超过 maxUsdValue,按比例缩小
+		if (totalValue > maxUsdValue) {
+			const scale = maxUsdValue / totalValue
+			if (base === 'MintA') {
+				baseAmount = baseAmount
+					.mul(new BN(Math.floor(scale * 10000)))
+					.div(new BN(10000))
+				otherAmountMax = chain
+					.getAmountBFromAmountA({
+						priceLower,
+						priceUpper,
+						amountA: baseAmount,
+						poolInfo,
+					})
+					.mul(new BN(10200))
+					.div(new BN(10000))
+			} else {
+				baseAmount = baseAmount
+					.mul(new BN(Math.floor(scale * 10000)))
+					.div(new BN(10000))
+				otherAmountMax = chain
+					.getAmountAFromAmountB({
+						priceLower,
+						priceUpper,
+						amountB: baseAmount,
+						poolInfo,
+					})
+					.mul(new BN(10200))
+					.div(new BN(10000))
+			}
+
+			// 重新计算总价值
+			const finalUiAmountA =
+				base === 'MintA'
+					? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsA)
+					: new Decimal(otherAmountMax.toString()).div(
+							10 ** poolInfo.mintDecimalsA
+						)
+			const finalUiAmountB =
+				base === 'MintB'
+					? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsB)
+					: new Decimal(otherAmountMax.toString()).div(
+							10 ** poolInfo.mintDecimalsB
+						)
+			totalValue =
+				finalUiAmountA.toNumber() * tokenAPriceUsd +
+				finalUiAmountB.toNumber() * tokenBPriceUsd
+		}
+
+		// 重新计算最终的 UI 金额和总价值
+		const finalUiAmountA =
+			base === 'MintA'
+				? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsA)
+				: new Decimal(otherAmountMax.toString()).div(
+						10 ** poolInfo.mintDecimalsA
+					)
+		const finalUiAmountB =
+			base === 'MintB'
+				? new Decimal(baseAmount.toString()).div(10 ** poolInfo.mintDecimalsB)
+				: new Decimal(otherAmountMax.toString()).div(
+						10 ** poolInfo.mintDecimalsB
+					)
+		totalValue =
+			finalUiAmountA.toNumber() * tokenAPriceUsd +
+			finalUiAmountB.toNumber() * tokenBPriceUsd
+
+		// 打印所有信息
+		console.log('\n========== LP Copy Information ==========')
+		console.log('Original Position Address:', positionAddress)
+		console.log('Referer Position (NFT Mint):', nftMint.toBase58())
+		console.log('\n--- Pool Information ---')
+		console.log('Pool Address:', poolInfo.poolId.toBase58())
+		console.log('Token A Address:', poolInfo.mintA.toBase58())
+		console.log('Token B Address:', poolInfo.mintB.toBase58())
+		console.log('Token A Decimals:', poolInfo.mintDecimalsA)
+		console.log('Token B Decimals:', poolInfo.mintDecimalsB)
+		console.log('Current Price (A/B):', currentPrice)
+		console.log('Token A Price (USD):', tokenAPriceUsd)
+		console.log('Token B Price (USD):', tokenBPriceUsd)
+		console.log('\n--- Position Range ---')
+		console.log('Tick Lower:', tickLower)
+		console.log('Tick Upper:', tickUpper)
+		console.log('Price Lower:', priceLower.toString())
+		console.log('Price Upper:', priceUpper.toString())
+		console.log('\n--- Investment Details ---')
+		console.log('Max USD Value:', maxUsdValue)
+		console.log('Base Token:', base)
+		console.log('Base Amount (raw):', baseAmount.toString())
+		console.log('Other Amount Max (raw):', otherAmountMax.toString())
+		console.log('Token A Amount (UI):', finalUiAmountA.toString())
+		console.log('Token B Amount (UI):', finalUiAmountB.toString())
+		console.log(
+			'Token A Value (USD):',
+			(finalUiAmountA.toNumber() * tokenAPriceUsd).toFixed(2)
+		)
+		console.log(
+			'Token B Value (USD):',
+			(finalUiAmountB.toNumber() * tokenBPriceUsd).toFixed(2)
+		)
+		console.log('Total Value (USD):', totalValue.toFixed(2))
+		console.log('==========================================\n')
+
+		// 从环境变量读取私钥
+		const secretKey = process.env.SOL_SECRET_KEY
+		if (!secretKey) {
+			return NextResponse.json(
+				{ error: 'SOL_SECRET_KEY not configured' },
+				{ status: 500 }
+			)
+		}
+
+		const userKeypair = Keypair.fromSecretKey(bs58.decode(secretKey))
+		const userAddress = userKeypair.publicKey
+		console.log('User Address:', userAddress.toBase58())
+		console.log('\n--- Executing Transaction ---')
+		console.log('Creating position on-chain...')
+
+		// 执行实际上链操作
+		const signerCallback = async (tx: VersionedTransaction) => {
+			tx.sign([userKeypair])
+			return tx
+		}
+
+		const txid = await chain.createPosition({
+			userAddress,
+			poolInfo,
+			tickLower,
+			tickUpper,
+			base,
+			baseAmount,
+			otherAmountMax,
+			refererPosition: positionAddress, // 添加 referer position
+			signerCallback,
+		})
+
+		console.log('Transaction ID:', txid)
+		console.log('Position created successfully!')
+		console.log('==========================================\n')
+
+		return NextResponse.json({
+			success: true,
+			txid,
+			positionInfo: {
+				poolAddress: poolInfo.poolId.toBase58(),
+				priceLower: priceLower.toString(),
+				priceUpper: priceUpper.toString(),
+				tickLower,
+				tickUpper,
+				base,
+				baseAmount: baseAmount.toString(),
+				otherAmountMax: otherAmountMax.toString(),
+				estimatedValue: totalValue,
+				tokenA: {
+					address: poolInfo.mintA.toBase58(),
+					amount: finalUiAmountA.toString(),
+					valueUsd: (finalUiAmountA.toNumber() * tokenAPriceUsd).toFixed(2),
+				},
+				tokenB: {
+					address: poolInfo.mintB.toBase58(),
+					amount: finalUiAmountB.toString(),
+					valueUsd: (finalUiAmountB.toNumber() * tokenBPriceUsd).toFixed(2),
+				},
+				refererPosition: positionAddress,
+				userAddress: userAddress?.toBase58() || 'N/A',
+			},
+		})
+	} catch (error: unknown) {
+		console.error('LP copy error:', error)
+		const errorMessage =
+			error instanceof Error ? error.message : 'Failed to copy LP position'
+		return NextResponse.json({ error: errorMessage }, { status: 500 })
+	}
+}

+ 11 - 13
src/app/components/Navigation.tsx

@@ -2,7 +2,6 @@
 
 import { Menu, Button, Dropdown } from 'antd'
 import { usePathname, useRouter } from 'next/navigation'
-import { useEffect, useState } from 'react'
 import { useTheme } from './ThemeProvider'
 import { MoonOutlined, SunOutlined, BulbOutlined } from '@ant-design/icons'
 
@@ -15,26 +14,25 @@ const menuItems = [
 		key: '/my-lp',
 		label: 'My LP',
 	},
+	{
+		key: '/lp-copy',
+		label: '自动复制LP',
+	},
 ]
 
 export default function Navigation() {
 	const pathname = usePathname()
 	const router = useRouter()
-	const { mode, setMode, isDark } = useTheme()
-	const [selectedKey, setSelectedKey] = useState<string>('/position')
+	const { mode, setMode } = useTheme()
 
-	useEffect(() => {
-		// 根据当前路径设置选中的菜单项
-		if (pathname === '/position' || pathname === '/my-lp') {
-			setSelectedKey(pathname)
-		} else {
-			// 如果不在已知路径,默认选中 position
-			setSelectedKey('/position')
-		}
-	}, [pathname])
+	// 根据当前路径计算选中的菜单项(派生状态,不需要 useState)
+	const selectedKey = {
+		'/position': '/position',
+		'/my-lp': '/my-lp',
+		'/lp-copy': '/lp-copy',
+	}[pathname]
 
 	const handleMenuClick = ({ key }: { key: string }) => {
-		setSelectedKey(key)
 		router.push(key)
 	}
 

+ 200 - 0
src/app/lp-copy/page.tsx

@@ -0,0 +1,200 @@
+'use client'
+
+import { useState } from 'react'
+import {
+	Card,
+	Input,
+	Button,
+	Form,
+	InputNumber,
+	message,
+	Descriptions,
+	Typography,
+	Space,
+} from 'antd'
+import { CopyOutlined, LoadingOutlined } from '@ant-design/icons'
+
+const { Title, Text } = Typography
+
+export default function LpCopyPage() {
+	const [loading, setLoading] = useState(false)
+	const [positionInfo, setPositionInfo] = useState<{
+		poolAddress: string
+		tickLower: number
+		tickUpper: number
+		base: string
+		baseAmount: string
+		otherAmountMax: string
+		estimatedValue: number
+		priceLower: string
+		priceUpper: string
+	} | null>(null)
+	const [form] = Form.useForm()
+
+	const handleCopy = async (values: {
+		positionAddress: string
+		maxUsdValue: number
+	}) => {
+		setLoading(true)
+		setPositionInfo(null)
+
+		try {
+			const response = await fetch('/api/lp-copy', {
+				method: 'POST',
+				headers: {
+					'Content-Type': 'application/json',
+				},
+				body: JSON.stringify({
+					positionAddress: values.positionAddress,
+					maxUsdValue: values.maxUsdValue,
+				}),
+			})
+
+			const data = await response.json()
+
+			if (!response.ok) {
+				throw new Error(data.error || 'Failed to copy position')
+			}
+
+			setPositionInfo(data.positionInfo)
+			message.success('Position copied successfully!')
+			message.info(`Transaction ID: ${data.txid}`)
+		} catch (error: unknown) {
+			const errorMessage =
+				error instanceof Error ? error.message : 'Failed to copy position'
+			message.error(errorMessage)
+		} finally {
+			setLoading(false)
+		}
+	}
+
+	return (
+		<div style={{ padding: '24px', maxWidth: '800px', margin: '0 auto' }}>
+			<Title level={2}>LP Position Copy</Title>
+			<Text type="secondary">
+				Copy an existing LP position with a limited investment amount. The
+				system will automatically calculate the optimal token amounts.
+			</Text>
+
+			<Card style={{ marginTop: '24px' }}>
+				<Form
+					form={form}
+					layout="vertical"
+					onFinish={handleCopy}
+					initialValues={{
+						maxUsdValue: 10,
+					}}
+				>
+					<Form.Item
+						label="Position Address"
+						name="positionAddress"
+						rules={[
+							{ required: true, message: 'Please enter position address' },
+							{
+								pattern: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/,
+								message: 'Invalid Solana address format',
+							},
+						]}
+					>
+						<Input
+							placeholder="Enter the NFT mint address of the position to copy"
+							size="large"
+						/>
+					</Form.Item>
+
+					<Form.Item
+						label="Maximum Investment (USD)"
+						name="maxUsdValue"
+						rules={[
+							{ required: true, message: 'Please enter maximum USD value' },
+							{
+								type: 'number',
+								min: 0.01,
+								message: 'Must be greater than 0.01',
+							},
+						]}
+					>
+						<InputNumber
+							placeholder="e.g., 5, 10, 50"
+							min={0.01}
+							step={1}
+							style={{ width: '100%' }}
+							size="large"
+							formatter={(value) =>
+								`$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
+							}
+							parser={(value) => {
+								const parsed = value?.replace(/\$\s?|(,*)/g, '') || '0'
+								return parseFloat(parsed) || 0
+							}}
+						/>
+					</Form.Item>
+
+					<Form.Item>
+						<Button
+							type="primary"
+							htmlType="submit"
+							size="large"
+							icon={loading ? <LoadingOutlined /> : <CopyOutlined />}
+							loading={loading}
+							block
+						>
+							{loading ? 'Copying Position...' : 'Copy Position'}
+						</Button>
+					</Form.Item>
+				</Form>
+			</Card>
+
+			{positionInfo && (
+				<Card style={{ marginTop: '24px' }} title="Position Details">
+					<Descriptions column={1} bordered>
+						<Descriptions.Item label="Pool Address">
+							<Text code>{positionInfo.poolAddress}</Text>
+						</Descriptions.Item>
+						<Descriptions.Item label="Tick Range">
+							{positionInfo.tickLower} - {positionInfo.tickUpper}
+						</Descriptions.Item>
+						<Descriptions.Item label="Price Range">
+							{positionInfo.priceLower} - {positionInfo.priceUpper}
+						</Descriptions.Item>
+						<Descriptions.Item label="Base Token">
+							{positionInfo.base}
+						</Descriptions.Item>
+						<Descriptions.Item label="Base Amount">
+							{positionInfo.baseAmount}
+						</Descriptions.Item>
+						<Descriptions.Item label="Other Amount Max">
+							{positionInfo.otherAmountMax}
+						</Descriptions.Item>
+						<Descriptions.Item label="Estimated Value">
+							${positionInfo.estimatedValue.toFixed(2)} USD
+						</Descriptions.Item>
+					</Descriptions>
+				</Card>
+			)}
+
+			<Card style={{ marginTop: '24px' }}>
+				<Title level={4}>How it works:</Title>
+				<Space orientation="vertical" size="small">
+					<Text>
+						1. Enter the NFT mint address of the position you want to copy
+					</Text>
+					<Text>2. Set your maximum investment amount in USD</Text>
+					<Text>3. The system will automatically:</Text>
+					<Text style={{ marginLeft: '16px' }}>
+						• Fetch the position details (price range, pool info)
+					</Text>
+					<Text style={{ marginLeft: '16px' }}>
+						• Calculate optimal token amounts within your budget
+					</Text>
+					<Text style={{ marginLeft: '16px' }}>
+						• Create a new position with the same price range
+					</Text>
+					<Text style={{ marginLeft: '16px' }}>
+						• Add a memo linking to the original position
+					</Text>
+				</Space>
+			</Card>
+		</div>
+	)
+}

+ 24 - 3
src/lib/byreal-clmm-sdk/src/client/chain/index.ts

@@ -12,7 +12,7 @@ import { Connection, PublicKey, VersionedTransaction, SystemProgram, Transaction
 import BN from 'bn.js';
 import { Decimal } from 'decimal.js';
 
-import { BYREAL_CLMM_PROGRAM_ID, U64_IGNORE_RANGE } from '../../constants';
+import { BYREAL_CLMM_PROGRAM_ID, U64_IGNORE_RANGE, MEMO_PROGRAM_ID } from '../../constants';
 import {
   IPoolLayoutWithId,
   IPersonalPositionLayout,
@@ -287,8 +287,17 @@ export class Chain {
    * @returns IInstructionReturn Contains instructions, signers, and transaction objects
    */
   public async createPositionInstructions(params: ICreatePositionParams): Promise<IInstructionReturn> {
-    const { userAddress, poolInfo, tickLower, tickUpper, base, baseAmount, otherAmountMax, transactionOptions } =
-      params;
+    const {
+      userAddress,
+      poolInfo,
+      tickLower,
+      tickUpper,
+      base,
+      baseAmount,
+      otherAmountMax,
+      transactionOptions,
+      refererPosition,
+    } = params;
     const { mintA, mintB } = poolInfo;
 
     // Calculate the actual required tokenA/B amount
@@ -328,6 +337,17 @@ export class Chain {
       ...endInstructions, // Cleanup
     ];
 
+    // Add memo instruction for referer position if provided
+    if (refererPosition) {
+      const memoText = `referer_position=${refererPosition}`;
+      const memoInstruction = new TransactionInstruction({
+        programId: MEMO_PROGRAM_ID,
+        keys: [{ pubkey: userAddress, isSigner: true, isWritable: false }],
+        data: Buffer.from(memoText, 'utf-8'),
+      });
+      instructions.push(memoInstruction);
+    }
+
     const signers = [...positionSigners];
 
     // Construct transaction object
@@ -874,6 +894,7 @@ export class Chain {
     });
     // Merge all instructions
     const instructions = [...preInstructions, ...increaseInstructions, ...endInstructions];
+
     // Construct transaction object
     const transaction = await makeTransaction({
       connection: this.connection,

+ 1 - 0
src/lib/byreal-clmm-sdk/src/client/chain/models.ts

@@ -32,6 +32,7 @@ export interface ICreatePositionParams {
   baseAmount: BN;
   otherAmountMax: BN;
   transactionOptions?: IMakeTransactionOptions;
+  refererPosition?: PublicKey; // Optional referer position address for LP copy relationship
 }
 
 export interface IClosePositionParams {

+ 14 - 18
src/lib/byreal-clmm-sdk/src/utils/transactionUtils.ts

@@ -175,23 +175,18 @@ export async function sendTransaction(params: {
 
   console.info(`Transaction sent: ${txid}`);
 
-  try {
-    // Solution 1: Use connection.confirmTransaction
-    await connection.confirmTransaction(txid, 'confirmed');
+  // 直接使用轮询方式确认交易,避免 WebSocket 403 错误
+  // 因为某些 RPC 节点不支持 WebSocket,使用 connection.confirmTransaction 会报错
+  const confirmed = await confirmTransactionWithOptimizedPolling(connection, txid, {
+    confirmationTimeout,
+    confirmationRetryInterval,
+    confirmationRetries,
+  });
+
+  if (confirmed) {
     console.info(`Transaction confirmed: ${txid}`);
-  } catch (err: any) {
-    console.warn(`Transaction confirmation failed, falling back to polling: ${err.message}`);
-
-    // Solution 2: If confirmTransaction fails, fallback to optimized polling
-    const confirmed = await confirmTransactionWithOptimizedPolling(connection, txid, {
-      confirmationTimeout,
-      confirmationRetryInterval,
-      confirmationRetries,
-    });
-
-    if (!confirmed) {
-      console.warn(`Transaction may not be confirmed: ${txid}`);
-    }
+  } else {
+    console.warn(`Transaction may not be confirmed: ${txid}`);
   }
 
   return txid;
@@ -238,8 +233,9 @@ async function confirmTransactionWithOptimizedPolling(
         currentInterval = Math.min(currentInterval * backoffMultiplier, maxInterval);
         retries--;
       }
-    } catch (err: any) {
-      console.warn(`Failed to check transaction status, reason: ${err.message}`);
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : 'Unknown error';
+      console.warn(`Failed to check transaction status, reason: ${errorMessage}`);
       retries--;
       await new Promise((resolve) => setTimeout(resolve, currentInterval));
       currentInterval = Math.min(currentInterval * backoffMultiplier, maxInterval);

+ 37 - 1
src/lib/config.ts

@@ -5,7 +5,43 @@ import { Chain } from '@/lib/byreal-clmm-sdk/src/client/index'
 
 const rpcUrl = getSolanaRpcUrl()
 
-export const connection = new Connection(rpcUrl)
+// 配置 Connection,禁用 WebSocket 以避免 403 错误
+// 使用 HTTP-only 模式,不建立 WebSocket 连接
+// 通过不提供 wsEndpoint 或提供 null 来禁用 WebSocket
+export const connection = new Connection(rpcUrl, {
+	commitment: 'confirmed',
+	disableRetryOnRateLimit: false,
+	// 明确禁用 WebSocket,只使用 HTTP RPC
+	// @ts-ignore - wsEndpoint 可能不在类型定义中,但可以设置
+	wsEndpoint: null,
+})
+
+// 捕获并忽略 WebSocket 相关错误(如果仍然出现)
+if (typeof process !== 'undefined') {
+	// 在 Node.js 环境中,捕获未处理的 WebSocket 错误
+	const originalUnhandledRejection = process.listeners('unhandledRejection')
+
+	process.on('unhandledRejection', (reason: unknown) => {
+		if (
+			reason instanceof Error &&
+			(reason.message.includes('ws error') ||
+				reason.message.includes('WebSocket') ||
+				reason.message.includes('403') ||
+				reason.message.includes('Unexpected server response'))
+		) {
+			// 静默忽略 WebSocket 错误,不打印到控制台
+			return
+		}
+		// 其他错误正常处理
+		if (originalUnhandledRejection.length > 0) {
+			originalUnhandledRejection.forEach((listener) => {
+				if (typeof listener === 'function') {
+					listener(reason, Promise.resolve())
+				}
+			})
+		}
+	})
+}
 
 export const chain = new Chain({
 	connection,