├── .gitattributes ├── .gitignore ├── .nvmrc ├── .prettierrc.json ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── backend └── hello │ ├── Cargo.toml │ ├── hello.did │ └── src │ └── lib.rs ├── deps ├── candid │ └── rdmx6-jaaaa-aaaaa-aaadq-cai.did └── pulled.json ├── dfx.json ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── predeploy.sh ├── public ├── demo.png └── icp-logo.svg ├── src ├── components │ └── Greeting.tsx ├── declarations │ └── hello │ │ ├── hello.did.d.ts │ │ ├── hello.did.js │ │ ├── index.d.ts │ │ └── index.js ├── pages │ ├── _app.tsx │ └── index.tsx ├── service │ └── hello.ts └── styles │ ├── Home.module.css │ └── global.css ├── tsconfig.json └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | .env.local 3 | # Various IDEs and Editors 4 | .vscode/ 5 | .idea/ 6 | **/*~ 7 | 8 | # Mac OSX temporary files 9 | .DS_Store 10 | **/.DS_Store 11 | ._.DS_Store 12 | 13 | # dfx temporary files 14 | .dfx/ 15 | .yarn 16 | canister_ids.json 17 | 18 | # frontend code 19 | node_modules/ 20 | out/ 21 | 22 | # Next.js 23 | .next/ 24 | 25 | # Rust build artifacts 26 | target/ 27 | Cargo.lock 28 | 29 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.16 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "trailingComma": "none", 4 | "semi": false, 5 | "arrowParens": "avoid" 6 | } 7 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "anyhow" 7 | version = "1.0.70" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" 10 | 11 | [[package]] 12 | name = "arrayvec" 13 | version = "0.5.2" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 16 | 17 | [[package]] 18 | name = "autocfg" 19 | version = "1.1.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 22 | 23 | [[package]] 24 | name = "binread" 25 | version = "2.2.0" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" 28 | dependencies = [ 29 | "binread_derive", 30 | "lazy_static", 31 | "rustversion", 32 | ] 33 | 34 | [[package]] 35 | name = "binread_derive" 36 | version = "2.1.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" 39 | dependencies = [ 40 | "either", 41 | "proc-macro2", 42 | "quote", 43 | "syn 1.0.109", 44 | ] 45 | 46 | [[package]] 47 | name = "block-buffer" 48 | version = "0.10.4" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 51 | dependencies = [ 52 | "generic-array", 53 | ] 54 | 55 | [[package]] 56 | name = "byteorder" 57 | version = "1.5.0" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 60 | 61 | [[package]] 62 | name = "candid" 63 | version = "0.10.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "a2525ab7a58543c132da8c780abe3aa1ba394ddcc1888a4ad2ba4f5100906ebe" 66 | dependencies = [ 67 | "anyhow", 68 | "binread", 69 | "byteorder", 70 | "candid_derive", 71 | "hex", 72 | "ic_principal", 73 | "leb128", 74 | "num-bigint", 75 | "num-traits", 76 | "paste", 77 | "pretty", 78 | "serde", 79 | "serde_bytes", 80 | "stacker", 81 | "thiserror", 82 | ] 83 | 84 | [[package]] 85 | name = "candid_derive" 86 | version = "0.6.5" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "970c220da8aa2fa6f7ef5dbbf3ea5b620a59eb3ac107cfb95ae8c6eebdfb7a08" 89 | dependencies = [ 90 | "lazy_static", 91 | "proc-macro2", 92 | "quote", 93 | "syn 2.0.15", 94 | ] 95 | 96 | [[package]] 97 | name = "cc" 98 | version = "1.0.79" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 101 | 102 | [[package]] 103 | name = "cfg-if" 104 | version = "1.0.0" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 107 | 108 | [[package]] 109 | name = "cpufeatures" 110 | version = "0.2.7" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" 113 | dependencies = [ 114 | "libc", 115 | ] 116 | 117 | [[package]] 118 | name = "crc32fast" 119 | version = "1.3.2" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 122 | dependencies = [ 123 | "cfg-if", 124 | ] 125 | 126 | [[package]] 127 | name = "crypto-common" 128 | version = "0.1.6" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 131 | dependencies = [ 132 | "generic-array", 133 | "typenum", 134 | ] 135 | 136 | [[package]] 137 | name = "data-encoding" 138 | version = "2.4.0" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" 141 | 142 | [[package]] 143 | name = "digest" 144 | version = "0.10.6" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 147 | dependencies = [ 148 | "block-buffer", 149 | "crypto-common", 150 | ] 151 | 152 | [[package]] 153 | name = "either" 154 | version = "1.8.1" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 157 | 158 | [[package]] 159 | name = "generic-array" 160 | version = "0.14.7" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 163 | dependencies = [ 164 | "typenum", 165 | "version_check", 166 | ] 167 | 168 | [[package]] 169 | name = "hello" 170 | version = "0.1.0" 171 | dependencies = [ 172 | "candid", 173 | "ic-cdk", 174 | ] 175 | 176 | [[package]] 177 | name = "hex" 178 | version = "0.4.3" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 181 | 182 | [[package]] 183 | name = "ic-cdk" 184 | version = "0.12.0" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "e4ec8231f413b8a4d74b99d7df26d6e917d6528a6245abde27f251210dcf9b72" 187 | dependencies = [ 188 | "candid", 189 | "ic-cdk-macros", 190 | "ic0", 191 | "serde", 192 | "serde_bytes", 193 | ] 194 | 195 | [[package]] 196 | name = "ic-cdk-macros" 197 | version = "0.8.2" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "ba23aedf7b8f89201dd778ad1bc8a04c35e3fda6fa6402f51da2cd9bb21045e6" 200 | dependencies = [ 201 | "candid", 202 | "proc-macro2", 203 | "quote", 204 | "serde", 205 | "serde_tokenstream", 206 | "syn 1.0.109", 207 | ] 208 | 209 | [[package]] 210 | name = "ic0" 211 | version = "0.21.1" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "a54b5297861c651551676e8c43df805dad175cc33bc97dbd992edbbb85dcbcdf" 214 | 215 | [[package]] 216 | name = "ic_principal" 217 | version = "0.1.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "899a4e8ddada85b91a2fe32b4dc6c0d475ef7bfef3f51cf2aecb26ee4ac4724f" 220 | dependencies = [ 221 | "crc32fast", 222 | "data-encoding", 223 | "hex", 224 | "serde", 225 | "serde_bytes", 226 | "sha2", 227 | "thiserror", 228 | ] 229 | 230 | [[package]] 231 | name = "lazy_static" 232 | version = "1.4.0" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 235 | 236 | [[package]] 237 | name = "leb128" 238 | version = "0.2.5" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 241 | 242 | [[package]] 243 | name = "libc" 244 | version = "0.2.142" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" 247 | 248 | [[package]] 249 | name = "num-bigint" 250 | version = "0.4.3" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 253 | dependencies = [ 254 | "autocfg", 255 | "num-integer", 256 | "num-traits", 257 | "serde", 258 | ] 259 | 260 | [[package]] 261 | name = "num-integer" 262 | version = "0.1.45" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 265 | dependencies = [ 266 | "autocfg", 267 | "num-traits", 268 | ] 269 | 270 | [[package]] 271 | name = "num-traits" 272 | version = "0.2.15" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 275 | dependencies = [ 276 | "autocfg", 277 | ] 278 | 279 | [[package]] 280 | name = "paste" 281 | version = "1.0.12" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" 284 | 285 | [[package]] 286 | name = "pretty" 287 | version = "0.12.3" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "b55c4d17d994b637e2f4daf6e5dc5d660d209d5642377d675d7a1c3ab69fa579" 290 | dependencies = [ 291 | "arrayvec", 292 | "typed-arena", 293 | "unicode-width", 294 | ] 295 | 296 | [[package]] 297 | name = "proc-macro2" 298 | version = "1.0.56" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" 301 | dependencies = [ 302 | "unicode-ident", 303 | ] 304 | 305 | [[package]] 306 | name = "psm" 307 | version = "0.1.21" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" 310 | dependencies = [ 311 | "cc", 312 | ] 313 | 314 | [[package]] 315 | name = "quote" 316 | version = "1.0.26" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" 319 | dependencies = [ 320 | "proc-macro2", 321 | ] 322 | 323 | [[package]] 324 | name = "rustversion" 325 | version = "1.0.12" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" 328 | 329 | [[package]] 330 | name = "serde" 331 | version = "1.0.160" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" 334 | dependencies = [ 335 | "serde_derive", 336 | ] 337 | 338 | [[package]] 339 | name = "serde_bytes" 340 | version = "0.11.9" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" 343 | dependencies = [ 344 | "serde", 345 | ] 346 | 347 | [[package]] 348 | name = "serde_derive" 349 | version = "1.0.160" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" 352 | dependencies = [ 353 | "proc-macro2", 354 | "quote", 355 | "syn 2.0.15", 356 | ] 357 | 358 | [[package]] 359 | name = "serde_tokenstream" 360 | version = "0.1.7" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "797ba1d80299b264f3aac68ab5d12e5825a561749db4df7cd7c8083900c5d4e9" 363 | dependencies = [ 364 | "proc-macro2", 365 | "serde", 366 | "syn 1.0.109", 367 | ] 368 | 369 | [[package]] 370 | name = "sha2" 371 | version = "0.10.6" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 374 | dependencies = [ 375 | "cfg-if", 376 | "cpufeatures", 377 | "digest", 378 | ] 379 | 380 | [[package]] 381 | name = "stacker" 382 | version = "0.1.15" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" 385 | dependencies = [ 386 | "cc", 387 | "cfg-if", 388 | "libc", 389 | "psm", 390 | "winapi", 391 | ] 392 | 393 | [[package]] 394 | name = "syn" 395 | version = "1.0.109" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 398 | dependencies = [ 399 | "proc-macro2", 400 | "quote", 401 | "unicode-ident", 402 | ] 403 | 404 | [[package]] 405 | name = "syn" 406 | version = "2.0.15" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" 409 | dependencies = [ 410 | "proc-macro2", 411 | "quote", 412 | "unicode-ident", 413 | ] 414 | 415 | [[package]] 416 | name = "thiserror" 417 | version = "1.0.40" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" 420 | dependencies = [ 421 | "thiserror-impl", 422 | ] 423 | 424 | [[package]] 425 | name = "thiserror-impl" 426 | version = "1.0.40" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" 429 | dependencies = [ 430 | "proc-macro2", 431 | "quote", 432 | "syn 2.0.15", 433 | ] 434 | 435 | [[package]] 436 | name = "typed-arena" 437 | version = "2.0.2" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" 440 | 441 | [[package]] 442 | name = "typenum" 443 | version = "1.16.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 446 | 447 | [[package]] 448 | name = "unicode-ident" 449 | version = "1.0.8" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 452 | 453 | [[package]] 454 | name = "unicode-width" 455 | version = "0.1.10" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 458 | 459 | [[package]] 460 | name = "version_check" 461 | version = "0.9.4" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 464 | 465 | [[package]] 466 | name = "winapi" 467 | version = "0.3.9" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 470 | dependencies = [ 471 | "winapi-i686-pc-windows-gnu", 472 | "winapi-x86_64-pc-windows-gnu", 473 | ] 474 | 475 | [[package]] 476 | name = "winapi-i686-pc-windows-gnu" 477 | version = "0.4.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 480 | 481 | [[package]] 482 | name = "winapi-x86_64-pc-windows-gnu" 483 | version = "0.4.0" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 486 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = ["backend/hello"] 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Behrad Deylami 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # InternetComputer - Rust + Next.js Template 2 | 3 | This is a template for creating a Next.js app with a Rust backend that can be deployed to the Internet Computer. 4 | 5 | ![Alt text](public/demo.png) 6 | 7 | ## Getting Started 8 | 9 | 1. Install the [DFINITY Canister SDK](https://sdk.dfinity.org/docs/quickstart/local-quickstart.html) 10 | 2. Install [Node.js](https://nodejs.org/en/download/) 11 | 3. Install [Rust](https://www.rust-lang.org/tools/install) 12 | 13 | ## Running Locally 14 | 15 | Installing dependencies: 16 | 17 | 1. Run `yarn install` or `npm install` 18 | it will run the following commands: 19 | 20 | Install Node.js dependencies: 21 | 22 | - Run `yarn install` or `npm install` 23 | 24 | For extract candid definition from canister WASM: 25 | 26 | - Run `yarn candid:install` or `npm run candid:install` 27 | 28 | For transforming Wasm canisters running on the Internet Computer: 29 | 30 | - Run `yarn ic-wasm:install` or `npm run ic-wasm:install` 31 | 32 | Running Local Internet Computer: 33 | 34 | 2. Run `yarn dfx:start` or `npm run dfx:start` 35 | 36 | Deploying to the Local Internet Computer: 37 | 38 | 3. Run `yarn deploy` or `npm run deploy` 39 | 40 | Running Next.js app: 41 | 42 | 4. Run `yarn dev` or `npm run dev` 43 | 5. Open http://localhost:3000 in your browser 44 | 45 | ## Deploying to the Internet Computer 46 | 47 | 1. Run `yarn deploy --network=ic` to deploy the canisters to the Internet Computer 48 | 49 | ## Notes 50 | 51 | - The Rust code is located in the `backend` directory 52 | - The Next.js code is located in the `src` directory 53 | - The canister configuration is located in the `dfx.json` file 54 | 55 | ## Other Branches 56 | 57 | - Motoko + Next.js Template: [motoko](https://github.com/b3hr4d/ic-rust-nextjs/tree/motoko?raw=true) 58 | 59 | ![motoko](https://github.com/b3hr4d/ic-rust-nextjs/blob/motoko/public/demo.png?raw=true) 60 | 61 | - Todo Motoko + Next.js Template: [motoko_todo](https://github.com/b3hr4d/ic-rust-nextjs/tree/motoko_todo) 62 | 63 | ![motoko_todo](https://github.com/b3hr4d/ic-rust-nextjs/blob/motoko_todo/public/demo.png?raw=true) 64 | 65 | - RadixUI + Rust + Next.js Template: [radix-ui](https://github.com/b3hr4d/ic-rust-nextjs/tree/radix-ui) 66 | 67 | ![radix-ui](https://github.com/b3hr4d/ic-rust-nextjs/blob/radix-ui/public/demo.png?raw=true) 68 | 69 | - Stable Memory + Rust + Next.js Template: [stable_memory](https://github.com/b3hr4d/ic-rust-nextjs/tree/stable_memory) 70 | 71 | ![stable_memory](https://github.com/b3hr4d/ic-rust-nextjs/blob/stable_memory/public/demo.png?raw=true) 72 | 73 | ## Resources 74 | 75 | - [DFINITY Canister SDK](https://sdk.dfinity.org/docs/quickstart/local-quickstart.html) 76 | - [Rust](https://www.rust-lang.org/) 77 | - [Next.js](https://nextjs.org/) 78 | - [ic-wasm](https://github.com/dfinity/ic-wasm) 79 | - [candid-extractor](https://github.com/dfinity/cdk-rs/tree/main/src/candid-extractor) 80 | - [radix-ui](https://www.radix-ui.com) 81 | - [@ic-reactor](https://github.com/B3Pay/ic-reactor) 82 | -------------------------------------------------------------------------------- /backend/hello/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hello" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | 11 | [dependencies] 12 | candid = "*" 13 | ic-cdk = "*" 14 | -------------------------------------------------------------------------------- /backend/hello/hello.did: -------------------------------------------------------------------------------- 1 | service : { greet : (text) -> (text) query } 2 | -------------------------------------------------------------------------------- /backend/hello/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[ic_cdk::query] 2 | fn greet(name: String) -> String { 3 | format!("Hello, {}!", name) 4 | } 5 | 6 | // Always include this at the end of your file 7 | ic_cdk::export_candid!(); 8 | -------------------------------------------------------------------------------- /deps/candid/rdmx6-jaaaa-aaaaa-aaadq-cai.did: -------------------------------------------------------------------------------- 1 | type UserNumber = nat64; 2 | type PublicKey = blob; 3 | type CredentialId = blob; 4 | type DeviceKey = PublicKey; 5 | type UserKey = PublicKey; 6 | type SessionKey = PublicKey; 7 | type FrontendHostname = text; 8 | type Timestamp = nat64; 9 | 10 | type HeaderField = record { 11 | text; 12 | text; 13 | }; 14 | 15 | type HttpRequest = record { 16 | method: text; 17 | url: text; 18 | headers: vec HeaderField; 19 | body: blob; 20 | certificate_version: opt nat16; 21 | }; 22 | 23 | type HttpResponse = record { 24 | status_code: nat16; 25 | headers: vec HeaderField; 26 | body: blob; 27 | upgrade : opt bool; 28 | streaming_strategy: opt StreamingStrategy; 29 | }; 30 | 31 | type StreamingCallbackHttpResponse = record { 32 | body: blob; 33 | token: opt Token; 34 | }; 35 | 36 | type Token = record {}; 37 | 38 | type StreamingStrategy = variant { 39 | Callback: record { 40 | callback: func (Token) -> (StreamingCallbackHttpResponse) query; 41 | token: Token; 42 | }; 43 | }; 44 | 45 | type Purpose = variant { 46 | recovery; 47 | authentication; 48 | }; 49 | 50 | type KeyType = variant { 51 | unknown; 52 | platform; 53 | cross_platform; 54 | seed_phrase; 55 | browser_storage_key; 56 | }; 57 | 58 | // This describes whether a device is "protected" or not. 59 | // When protected, a device can only be updated or removed if the 60 | // user is authenticated with that very device. 61 | type DeviceProtection = variant { 62 | protected; 63 | unprotected; 64 | }; 65 | 66 | type Challenge = record { 67 | png_base64: text; 68 | challenge_key: ChallengeKey; 69 | }; 70 | 71 | type DeviceData = record { 72 | pubkey : DeviceKey; 73 | alias : text; 74 | credential_id : opt CredentialId; 75 | purpose: Purpose; 76 | key_type: KeyType; 77 | protection: DeviceProtection; 78 | origin: opt text; 79 | // Metadata map for additional device information. 80 | // 81 | // Note: some fields above will be moved to the metadata map in the future. 82 | // All field names of `DeviceData` (such as 'alias', 'origin, etc.) are 83 | // reserved and cannot be written. 84 | // In addition, the keys "usage" and "authenticator_attachment" are reserved as well. 85 | metadata: opt MetadataMap; 86 | }; 87 | 88 | // The same as `DeviceData` but with the `last_usage` field. 89 | // This field cannot be written, hence the separate type. 90 | type DeviceWithUsage = record { 91 | pubkey : DeviceKey; 92 | alias : text; 93 | credential_id : opt CredentialId; 94 | purpose: Purpose; 95 | key_type: KeyType; 96 | protection: DeviceProtection; 97 | origin: opt text; 98 | last_usage: opt Timestamp; 99 | metadata: opt MetadataMap; 100 | }; 101 | 102 | // Map with some variants for the value type. 103 | // Note, due to the Candid mapping this must be a tuple type thus we cannot name the fields `key` and `value`. 104 | type MetadataMap = vec record { 105 | text; 106 | variant { map : MetadataMap; string : text; bytes : vec nat8 }; 107 | }; 108 | 109 | type RegisterResponse = variant { 110 | // A new user was successfully registered. 111 | registered: record { 112 | user_number: UserNumber; 113 | }; 114 | // No more registrations are possible in this instance of the II service canister. 115 | canister_full; 116 | // The challenge was not successful. 117 | bad_challenge; 118 | }; 119 | 120 | type AddTentativeDeviceResponse = variant { 121 | // The device was tentatively added. 122 | added_tentatively: record { 123 | verification_code: text; 124 | // Expiration date, in nanos since the epoch 125 | device_registration_timeout: Timestamp; 126 | }; 127 | // Device registration mode is off, either due to timeout or because it was never enabled. 128 | device_registration_mode_off; 129 | // There is another device already added tentatively 130 | another_device_tentatively_added; 131 | }; 132 | 133 | type VerifyTentativeDeviceResponse = variant { 134 | // The device was successfully verified. 135 | verified; 136 | // Wrong verification code entered. Retry with correct code. 137 | wrong_code: record { 138 | retries_left: nat8 139 | }; 140 | // Device registration mode is off, either due to timeout or because it was never enabled. 141 | device_registration_mode_off; 142 | // There is no tentative device to be verified. 143 | no_device_to_verify; 144 | }; 145 | 146 | type Delegation = record { 147 | pubkey: PublicKey; 148 | expiration: Timestamp; 149 | targets: opt vec principal; 150 | }; 151 | 152 | type SignedDelegation = record { 153 | delegation: Delegation; 154 | signature: blob; 155 | }; 156 | 157 | type GetDelegationResponse = variant { 158 | // The signed delegation was successfully retrieved. 159 | signed_delegation: SignedDelegation; 160 | 161 | // The signature is not ready. Maybe retry by calling `prepare_delegation` 162 | no_such_delegation 163 | }; 164 | 165 | type InternetIdentityStats = record { 166 | users_registered: nat64; 167 | storage_layout_version: nat8; 168 | assigned_user_number_range: record { 169 | nat64; 170 | nat64; 171 | }; 172 | archive_info: ArchiveInfo; 173 | canister_creation_cycles_cost: nat64; 174 | max_num_latest_delegation_origins: nat64; 175 | latest_delegation_origins: vec FrontendHostname 176 | }; 177 | 178 | // Configuration parameters related to the archive. 179 | type ArchiveConfig = record { 180 | // The allowed module hash of the archive canister. 181 | // Changing this parameter does _not_ deploy the archive, but enable archive deployments with the 182 | // corresponding wasm module. 183 | module_hash : blob; 184 | // Buffered archive entries limit. If reached, II will stop accepting new anchor operations 185 | // until the buffered operations are acknowledged by the archive. 186 | entries_buffer_limit: nat64; 187 | // The maximum number of entries to be transferred to the archive per call. 188 | entries_fetch_limit: nat16; 189 | // Polling interval to fetch new entries from II (in nanoseconds). 190 | // Changes to this parameter will only take effect after an archive deployment. 191 | polling_interval_ns: nat64; 192 | }; 193 | 194 | // Information about the archive. 195 | type ArchiveInfo = record { 196 | // Canister id of the archive or empty if no archive has been deployed yet. 197 | archive_canister : opt principal; 198 | // Configuration parameters related to the II archive. 199 | archive_config: opt ArchiveConfig; 200 | }; 201 | 202 | // Rate limit configuration. 203 | // Currently only used for `register`. 204 | type RateLimitConfig = record { 205 | // Time it takes (in ns) for a rate limiting token to be replenished. 206 | time_per_token_ns : nat64; 207 | // How many tokens are at most generated (to accommodate peaks). 208 | max_tokens: nat64; 209 | }; 210 | 211 | // Init arguments of II which can be supplied on install and upgrade. 212 | // Setting a value to null keeps the previous value. 213 | type InternetIdentityInit = record { 214 | // Set lowest and highest anchor 215 | assigned_user_number_range : opt record { 216 | nat64; 217 | nat64; 218 | }; 219 | // Configuration parameters related to the II archive. 220 | // Note: some parameters changes (like the polling interval) will only take effect after an archive deployment. 221 | // See ArchiveConfig for details. 222 | archive_config: opt ArchiveConfig; 223 | // Set the amounts of cycles sent with the create canister message. 224 | // This is configurable because in the staging environment cycles are required. 225 | // The canister creation cost on mainnet is currently 100'000'000'000 cycles. If this value is higher thant the 226 | // canister creation cost, the newly created canister will keep extra cycles. 227 | canister_creation_cycles_cost : opt nat64; 228 | // Rate limit for the `register` call. 229 | register_rate_limit : opt RateLimitConfig; 230 | // Maximum number of latest delegation origins to track. 231 | // Default: 1000 232 | max_num_latest_delegation_origins : opt nat64; 233 | // Maximum number of inflight captchas. 234 | // Default: 500 235 | max_inflight_captchas: opt nat64; 236 | }; 237 | 238 | type ChallengeKey = text; 239 | 240 | type ChallengeResult = record { 241 | key : ChallengeKey; 242 | chars : text; 243 | }; 244 | type CaptchaResult = ChallengeResult; 245 | 246 | // Extra information about registration status for new devices 247 | type DeviceRegistrationInfo = record { 248 | // If present, the user has tentatively added a new device. This 249 | // new device needs to be verified (see relevant endpoint) before 250 | // 'expiration'. 251 | tentative_device : opt DeviceData; 252 | // The timestamp at which the anchor will turn off registration mode 253 | // (and the tentative device will be forgotten, if any, and if not verified) 254 | expiration: Timestamp; 255 | }; 256 | 257 | // Information about the anchor 258 | type IdentityAnchorInfo = record { 259 | // All devices that can authenticate to this anchor 260 | devices : vec DeviceWithUsage; 261 | // Device registration status used when adding devices, see DeviceRegistrationInfo 262 | device_registration: opt DeviceRegistrationInfo; 263 | }; 264 | 265 | type AnchorCredentials = record { 266 | credentials : vec WebAuthnCredential; 267 | recovery_credentials : vec WebAuthnCredential; 268 | recovery_phrases: vec PublicKey; 269 | }; 270 | 271 | type WebAuthnCredential = record { 272 | credential_id : CredentialId; 273 | pubkey: PublicKey; 274 | }; 275 | 276 | type DeployArchiveResult = variant { 277 | // The archive was deployed successfully and the supplied wasm module has been installed. The principal of the archive 278 | // canister is returned. 279 | success: principal; 280 | // Initial archive creation is already in progress. 281 | creation_in_progress; 282 | // Archive deployment failed. An error description is returned. 283 | failed: text; 284 | }; 285 | 286 | type BufferedArchiveEntry = record { 287 | anchor_number: UserNumber; 288 | timestamp: Timestamp; 289 | sequence_number: nat64; 290 | entry: blob; 291 | }; 292 | 293 | // API V2 specific types 294 | // WARNING: These type are experimental and may change in the future. 295 | 296 | type IdentityNumber = nat64; 297 | 298 | // Map with some variants for the value type. 299 | // Note, due to the Candid mapping this must be a tuple type thus we cannot name the fields `key` and `value`. 300 | type MetadataMapV2 = vec record { 301 | text; 302 | variant { Map : MetadataMapV2; String : text; Bytes : vec nat8 }; 303 | }; 304 | 305 | // Authentication method using WebAuthn signatures 306 | // See https://www.w3.org/TR/webauthn-2/ 307 | // This is a separate type because WebAuthn requires to also store 308 | // the credential id (in addition to the public key). 309 | type WebAuthn = record { 310 | credential_id: CredentialId; 311 | pubkey: PublicKey; 312 | }; 313 | 314 | // Authentication method using generic signatures 315 | // See https://internetcomputer.org/docs/current/references/ic-interface-spec/#signatures for 316 | // supported signature schemes. 317 | type PublicKeyAuthn = record { 318 | pubkey: PublicKey; 319 | }; 320 | 321 | // The authentication methods currently supported by II. 322 | type AuthnMethod = variant { 323 | WebAuthn: WebAuthn; 324 | PubKey: PublicKeyAuthn; 325 | }; 326 | 327 | // This describes whether an authentication method is "protected" or not. 328 | // When protected, a authentication method can only be updated or removed if the 329 | // user is authenticated with that very authentication method. 330 | type AuthnMethodProtection = variant { 331 | Protected; 332 | Unprotected; 333 | }; 334 | 335 | type AuthnMethodPurpose = variant { 336 | Recovery; 337 | Authentication; 338 | }; 339 | 340 | type AuthnMethodSecuritySettings = record { 341 | protection: AuthnMethodProtection; 342 | purpose: AuthnMethodPurpose; 343 | }; 344 | 345 | type AuthnMethodData = record { 346 | authn_method: AuthnMethod; 347 | security_settings: AuthnMethodSecuritySettings; 348 | // contains the following fields of the DeviceWithUsage type: 349 | // - alias 350 | // - origin 351 | // - authenticator_attachment: data taken from key_type and reduced to "platform", "cross_platform" or absent on migration 352 | // - usage: data taken from key_type and reduced to "recovery_phrase", "browser_storage_key" or absent on migration 353 | // Note: for compatibility reasons with the v1 API, the entries above (if present) 354 | // must be of the `String` variant. This restriction may be lifted in the future. 355 | metadata: MetadataMapV2; 356 | last_authentication: opt Timestamp; 357 | }; 358 | 359 | // Extra information about registration status for new authentication methods 360 | type AuthnMethodRegistrationInfo = record { 361 | // If present, the user has registered a new authentication method. This 362 | // new authentication needs to be verified before 'expiration' in order to 363 | // be added to the identity. 364 | authn_method : opt AuthnMethodData; 365 | // The timestamp at which the identity will turn off registration mode 366 | // (and the authentication method will be forgotten, if any, and if not verified) 367 | expiration: Timestamp; 368 | }; 369 | 370 | type AuthnMethodConfirmationCode = record { 371 | confirmation_code: text; 372 | expiration: Timestamp; 373 | }; 374 | 375 | type AuthnMethodRegisterError = variant { 376 | // Authentication method registration mode is off, either due to timeout or because it was never enabled. 377 | RegistrationModeOff; 378 | // There is another authentication method already registered that needs to be confirmed first. 379 | RegistrationAlreadyInProgress; 380 | // The metadata of the provided authentication method contains invalid entries. 381 | InvalidMetadata: text; 382 | }; 383 | 384 | type AuthnMethodConfirmationError = variant { 385 | // Wrong confirmation code entered. Retry with correct code. 386 | WrongCode: record { 387 | retries_left: nat8 388 | }; 389 | // Authentication method registration mode is off, either due to timeout or because it was never enabled. 390 | RegistrationModeOff; 391 | // There is no registered authentication method to be confirmed. 392 | NoAuthnMethodToConfirm; 393 | }; 394 | 395 | type IdentityAuthnInfo = record { 396 | authn_methods: vec AuthnMethod; 397 | recovery_authn_methods: vec AuthnMethod; 398 | }; 399 | 400 | type IdentityInfo = record { 401 | authn_methods: vec AuthnMethodData; 402 | authn_method_registration: opt AuthnMethodRegistrationInfo; 403 | // Authentication method independent metadata 404 | metadata: MetadataMapV2; 405 | }; 406 | 407 | type IdentityInfoError = variant { 408 | /// The principal is not authorized to call this method with the given arguments. 409 | Unauthorized: principal; 410 | /// Internal canister error. See the error message for details. 411 | InternalCanisterError: text; 412 | }; 413 | 414 | 415 | 416 | type IdentityRegisterError = variant { 417 | // No more registrations are possible in this instance of the II service canister. 418 | CanisterFull; 419 | // The captcha check was not successful. 420 | BadCaptcha; 421 | // The metadata of the provided authentication method contains invalid entries. 422 | InvalidMetadata: text; 423 | }; 424 | 425 | type AuthnMethodAddError = variant { 426 | InvalidMetadata: text; 427 | }; 428 | 429 | type AuthnMethodReplaceError = variant { 430 | InvalidMetadata: text; 431 | // No authentication method found with the given public key. 432 | AuthnMethodNotFound; 433 | }; 434 | 435 | type AuthnMethodMetadataReplaceError = variant { 436 | InvalidMetadata: text; 437 | /// No authentication method found with the given public key. 438 | AuthnMethodNotFound; 439 | }; 440 | 441 | type AuthnMethodSecuritySettingsReplaceError = variant { 442 | /// No authentication method found with the given public key. 443 | AuthnMethodNotFound; 444 | }; 445 | 446 | type IdentityMetadataReplaceError = variant { 447 | /// The principal is not authorized to call this method with the given arguments. 448 | Unauthorized: principal; 449 | /// The identity including the new metadata exceeds the maximum allowed size. 450 | StorageSpaceExceeded: record {space_available: nat64; space_required: nat64}; 451 | /// Internal canister error. See the error message for details. 452 | InternalCanisterError: text; 453 | }; 454 | 455 | type PrepareIdAliasRequest = record { 456 | /// Origin of the issuer in the attribute sharing flow. 457 | issuer : FrontendHostname; 458 | /// Origin of the relying party in the attribute sharing flow. 459 | relying_party : FrontendHostname; 460 | /// Identity for which the IdAlias should be generated. 461 | identity_number : IdentityNumber; 462 | }; 463 | 464 | type PrepareIdAliasError = variant { 465 | /// The principal is not authorized to call this method with the given arguments. 466 | Unauthorized: principal; 467 | /// Internal canister error. See the error message for details. 468 | InternalCanisterError: text; 469 | }; 470 | 471 | /// The prepared id alias contains two (still unsigned) credentials in JWT format, 472 | /// certifying the id alias for the issuer resp. the relying party. 473 | type PreparedIdAlias = record { 474 | rp_id_alias_jwt : text; 475 | issuer_id_alias_jwt : text; 476 | canister_sig_pk_der : PublicKey; 477 | }; 478 | 479 | /// The request to retrieve the actual signed id alias credentials. 480 | /// The field values should be equal to the values of corresponding 481 | /// fields from the preceding `PrepareIdAliasRequest` and `PrepareIdAliasResponse`. 482 | type GetIdAliasRequest = record { 483 | rp_id_alias_jwt : text; 484 | issuer : FrontendHostname; 485 | issuer_id_alias_jwt : text; 486 | relying_party : FrontendHostname; 487 | identity_number : IdentityNumber; 488 | }; 489 | 490 | type GetIdAliasError = variant { 491 | /// The principal is not authorized to call this method with the given arguments. 492 | Unauthorized: principal; 493 | /// The credential(s) are not available: may be expired or not prepared yet (call prepare_id_alias to prepare). 494 | NoSuchCredentials : text; 495 | /// Internal canister error. See the error message for details. 496 | InternalCanisterError: text; 497 | }; 498 | 499 | /// The signed id alias credentials for each involved party. 500 | type IdAliasCredentials = record { 501 | rp_id_alias_credential : SignedIdAlias; 502 | issuer_id_alias_credential : SignedIdAlias; 503 | }; 504 | 505 | type SignedIdAlias = record { 506 | credential_jws : text; 507 | id_alias : principal; 508 | id_dapp : principal; 509 | }; 510 | 511 | service : (opt InternetIdentityInit) -> { 512 | init_salt: () -> (); 513 | create_challenge : () -> (Challenge); 514 | register : (DeviceData, ChallengeResult, opt principal) -> (RegisterResponse); 515 | add : (UserNumber, DeviceData) -> (); 516 | update : (UserNumber, DeviceKey, DeviceData) -> (); 517 | // Atomically replace device matching the device key with the new device data 518 | replace : (UserNumber, DeviceKey, DeviceData) -> (); 519 | remove : (UserNumber, DeviceKey) -> (); 520 | // Returns all devices of the user (authentication and recovery) but no information about device registrations. 521 | // Note: Clears out the 'alias' fields on the devices. Use 'get_anchor_info' to obtain the full information. 522 | // Deprecated: Use 'get_anchor_credentials' instead. 523 | lookup : (UserNumber) -> (vec DeviceData) query; 524 | get_anchor_credentials : (UserNumber) -> (AnchorCredentials) query; 525 | get_anchor_info : (UserNumber) -> (IdentityAnchorInfo); 526 | get_principal : (UserNumber, FrontendHostname) -> (principal) query; 527 | stats : () -> (InternetIdentityStats) query; 528 | 529 | enter_device_registration_mode : (UserNumber) -> (Timestamp); 530 | exit_device_registration_mode : (UserNumber) -> (); 531 | add_tentative_device : (UserNumber, DeviceData) -> (AddTentativeDeviceResponse); 532 | verify_tentative_device : (UserNumber, verification_code: text) -> (VerifyTentativeDeviceResponse); 533 | 534 | prepare_delegation : (UserNumber, FrontendHostname, SessionKey, maxTimeToLive : opt nat64) -> (UserKey, Timestamp); 535 | get_delegation: (UserNumber, FrontendHostname, SessionKey, Timestamp) -> (GetDelegationResponse) query; 536 | 537 | http_request: (request: HttpRequest) -> (HttpResponse) query; 538 | http_request_update: (request: HttpRequest) -> (HttpResponse); 539 | 540 | deploy_archive: (wasm: blob) -> (DeployArchiveResult); 541 | /// Returns a batch of entries _sorted by sequence number_ to be archived. 542 | /// This is an update call because the archive information _must_ be certified. 543 | /// Only callable by this IIs archive canister. 544 | fetch_entries: () -> (vec BufferedArchiveEntry); 545 | acknowledge_entries: (sequence_number: nat64) -> (); 546 | 547 | // V2 API 548 | // WARNING: The following methods are experimental and may change in the future. 549 | 550 | // Creates a new captcha. The solution needs to be submitted using the 551 | // `identity_register` call. 552 | captcha_create: () -> (variant {Ok: Challenge; Err;}); 553 | 554 | // Registers a new identity with the given authn_method. 555 | // A valid captcha solution to a previously generated captcha (using create_captcha) must be provided. 556 | // The sender needs to match the supplied authn_method. 557 | identity_register: (AuthnMethodData, CaptchaResult, opt principal) -> (variant {Ok: IdentityNumber; Err: IdentityRegisterError;}); 558 | 559 | // Returns information about the authentication methods of the identity with the given number. 560 | // Only returns the minimal information required for authentication without exposing any metadata such as aliases. 561 | identity_authn_info: (IdentityNumber) -> (variant {Ok: IdentityAuthnInfo; Err;}) query; 562 | 563 | // Returns information about the identity with the given number. 564 | // Requires authentication. 565 | identity_info: (IdentityNumber) -> (variant {Ok: IdentityInfo; Err: IdentityInfoError;}); 566 | 567 | // Replaces the authentication method independent metadata map. 568 | // The existing metadata map will be overwritten. 569 | // Requires authentication. 570 | identity_metadata_replace: (IdentityNumber, MetadataMapV2) -> (variant {Ok; Err: IdentityMetadataReplaceError;}); 571 | 572 | // Adds a new authentication method to the identity. 573 | // Requires authentication. 574 | authn_method_add: (IdentityNumber, AuthnMethodData) -> (variant {Ok; Err: AuthnMethodAddError;}); 575 | 576 | // Atomically replaces the authentication method matching the supplied public key with the new authentication method 577 | // provided. 578 | // Requires authentication. 579 | authn_method_replace: (IdentityNumber, PublicKey, AuthnMethodData) -> (variant {Ok; Err: AuthnMethodReplaceError;}); 580 | 581 | // Replaces the authentication method metadata map. 582 | // The existing metadata map will be overwritten. 583 | // Requires authentication. 584 | authn_method_metadata_replace: (IdentityNumber, PublicKey, MetadataMapV2) -> (variant {Ok; Err: AuthnMethodMetadataReplaceError;}); 585 | 586 | // Replaces the authentication method security settings. 587 | // The existing security settings will be overwritten. 588 | // Requires authentication. 589 | authn_method_security_settings_replace: (IdentityNumber, PublicKey, AuthnMethodSecuritySettings) -> (variant {Ok; Err: AuthnMethodSecuritySettingsReplaceError;}); 590 | 591 | // Removes the authentication method associated with the public key from the identity. 592 | // Requires authentication. 593 | authn_method_remove: (IdentityNumber, PublicKey) -> (variant {Ok; Err;}); 594 | 595 | // Enters the authentication method registration mode for the identity. 596 | // In this mode, a new authentication method can be registered, which then needs to be 597 | // confirmed before it can be used for authentication on this identity. 598 | // The registration mode is automatically exited after the returned expiration timestamp. 599 | // Requires authentication. 600 | authn_method_registration_mode_enter : (IdentityNumber) -> (variant {Ok: record { expiration: Timestamp; }; Err;}); 601 | 602 | // Exits the authentication method registration mode for the identity. 603 | // Requires authentication. 604 | authn_method_registration_mode_exit : (IdentityNumber) -> (variant {Ok; Err;}); 605 | 606 | // Registers a new authentication method to the identity. 607 | // This authentication method needs to be confirmed before it can be used for authentication on this identity. 608 | authn_method_register: (IdentityNumber, AuthnMethodData) -> (variant {Ok: AuthnMethodConfirmationCode; Err: AuthnMethodRegisterError;}); 609 | 610 | // Confirms a previously registered authentication method. 611 | // On successful confirmation, the authentication method is permanently added to the identity and can 612 | // subsequently be used for authentication for that identity. 613 | // Requires authentication. 614 | authn_method_confirm: (IdentityNumber, confirmation_code: text) -> (variant {Ok; Err: AuthnMethodConfirmationError;}); 615 | 616 | // Attribute Sharing MVP API 617 | // The methods below are used to generate ID-alias credentials during attribute sharing flow. 618 | prepare_id_alias : (PrepareIdAliasRequest) -> (variant {Ok: PreparedIdAlias; Err: PrepareIdAliasError;}); 619 | get_id_alias : (GetIdAliasRequest) -> (variant {Ok: IdAliasCredentials; Err: GetIdAliasError;}) query; 620 | } 621 | -------------------------------------------------------------------------------- /deps/pulled.json: -------------------------------------------------------------------------------- 1 | { 2 | "canisters": { 3 | "rdmx6-jaaaa-aaaaa-aaadq-cai": { 4 | "name": "internet_identity", 5 | "wasm_hash": "364919da03baf2376ff690c0422dfbc7da96c1300f55b46eefe53b9411b3cf01", 6 | "init_guide": "Use '(null)' for sensible defaults. See the candid interface for more details.", 7 | "init_arg": null, 8 | "candid_args": "(opt InternetIdentityInit)", 9 | "gzip": true 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /dfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "canisters": { 3 | "hello": { 4 | "type": "rust", 5 | "candid": "backend/hello/hello.did", 6 | "package": "hello", 7 | "declarations": { 8 | "node_compatibility": true 9 | } 10 | }, 11 | "frontend": { 12 | "dependencies": [ 13 | "hello" 14 | ], 15 | "frontend": { 16 | "entrypoint": "out/index.html" 17 | }, 18 | "source": [ 19 | "out" 20 | ], 21 | "type": "assets" 22 | } 23 | }, 24 | "output_env_file": ".env.local", 25 | "version": 1 26 | } -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | // Adjust the path to load env from ../.env file 2 | const envList = require("dotenv").config({ path: "./.env.local" }).parsed || {} 3 | 4 | // Adjust the path to get version from package.json 5 | const { version } = require("./package.json") 6 | 7 | envList.NEXT_PUBLIC_IC_HOST = 8 | envList.DFX_NETWORK === "ic" ? "https://icp-api.io" : "http://localhost:4943" 9 | 10 | envList.NEXT_PUBLIC_VERSION = version 11 | 12 | /** @type {import('next').NextConfig} */ 13 | module.exports = { 14 | env: envList, 15 | output: "export", 16 | images: { 17 | unoptimized: true, 18 | }, 19 | staticPageGenerationTimeout: 10000 20 | } 21 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ic-rust-nextjs", 3 | "version": "1.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ic-rust-nextjs", 9 | "version": "1.0.1", 10 | "dependencies": { 11 | "@ic-reactor/react": "^1.2", 12 | "next": "^14.2.5", 13 | "react": "^18.3.1", 14 | "react-dom": "^18.3.1" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "^20.14.10", 18 | "@types/react": "^18.3.3", 19 | "dotenv": "^16.4.5", 20 | "typescript": "^5.5.3" 21 | } 22 | }, 23 | "node_modules/@babel/runtime": { 24 | "version": "7.24.0", 25 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", 26 | "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", 27 | "dependencies": { 28 | "regenerator-runtime": "^0.14.0" 29 | }, 30 | "engines": { 31 | "node": ">=6.9.0" 32 | } 33 | }, 34 | "node_modules/@dfinity/agent": { 35 | "version": "1.4.0", 36 | "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.4.0.tgz", 37 | "integrity": "sha512-/zgGajZpxtbu+kLXtFx2e9V2+HbMUjrtGWx9ZEwtVwhVxKgVi/2kGQpFRPEDFJ461V7wdTwCig4OkMxVU4shTw==", 38 | "license": "Apache-2.0", 39 | "dependencies": { 40 | "@noble/curves": "^1.4.0", 41 | "@noble/hashes": "^1.3.1", 42 | "base64-arraybuffer": "^0.2.0", 43 | "borc": "^2.1.1", 44 | "buffer": "^6.0.3", 45 | "simple-cbor": "^0.4.1" 46 | }, 47 | "peerDependencies": { 48 | "@dfinity/candid": "^1.4.0", 49 | "@dfinity/principal": "^1.4.0" 50 | } 51 | }, 52 | "node_modules/@dfinity/auth-client": { 53 | "version": "1.4.0", 54 | "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-1.4.0.tgz", 55 | "integrity": "sha512-9ImeOAw61SQvHJ+w4RHIuKKUL2xAQDLoce+JhmH3DbJuVvNbZIM5xMW8gHTZVlXaMw3Vhip+a1DPJIGy95r9pA==", 56 | "license": "Apache-2.0", 57 | "dependencies": { 58 | "idb": "^7.0.2" 59 | }, 60 | "peerDependencies": { 61 | "@dfinity/agent": "^1.4.0", 62 | "@dfinity/identity": "^1.4.0", 63 | "@dfinity/principal": "^1.4.0" 64 | } 65 | }, 66 | "node_modules/@dfinity/candid": { 67 | "version": "1.4.0", 68 | "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.4.0.tgz", 69 | "integrity": "sha512-PsTJVn63ZM4A/6Xs5coI0zMFevSwJ8hcyh38LdH/92n6wi9UOTis1yc4qL5MZvvRCUAD0c3rVjELL+49E9sPyA==", 70 | "license": "Apache-2.0", 71 | "peerDependencies": { 72 | "@dfinity/principal": "^1.4.0" 73 | } 74 | }, 75 | "node_modules/@dfinity/identity": { 76 | "version": "1.4.0", 77 | "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-1.4.0.tgz", 78 | "integrity": "sha512-4WmMsQSuzfWXmm4s+0FYGbFiQcMGE88Ztg6yFq7aTMtRWuAjhz66Dy1+jRCrXxsoxvDdUvPzsyjkOSpr1AuUYQ==", 79 | "license": "Apache-2.0", 80 | "dependencies": { 81 | "@noble/curves": "^1.2.0", 82 | "@noble/hashes": "^1.3.1", 83 | "borc": "^2.1.1" 84 | }, 85 | "peerDependencies": { 86 | "@dfinity/agent": "^1.4.0", 87 | "@dfinity/principal": "^1.4.0", 88 | "@peculiar/webcrypto": "^1.4.0" 89 | } 90 | }, 91 | "node_modules/@dfinity/principal": { 92 | "version": "1.4.0", 93 | "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.4.0.tgz", 94 | "integrity": "sha512-SuTBVlc71ub89ji0WN5/T100zUG2uIMn5x4+We4vS4nJ0R3/Xt89XJsHepjd5SQTSQPOvP7eQ+S8cQKWRz/RkA==", 95 | "license": "Apache-2.0", 96 | "dependencies": { 97 | "@noble/hashes": "^1.3.1" 98 | } 99 | }, 100 | "node_modules/@ic-reactor/core": { 101 | "version": "1.8.0", 102 | "resolved": "https://registry.npmjs.org/@ic-reactor/core/-/core-1.8.0.tgz", 103 | "integrity": "sha512-5NhsCHKk8OF/ePCgGU9632dDM8AbCbOmKrCMle2tzpAAbueOsqH6pC8EY8LOIljAO0iMETpeKNLqI2E0OND4TA==", 104 | "license": "MIT", 105 | "dependencies": { 106 | "@dfinity/agent": "^1.3", 107 | "@dfinity/auth-client": "^1.3", 108 | "@dfinity/candid": "^1.3", 109 | "@dfinity/identity": "^1.3", 110 | "@dfinity/principal": "^1.3", 111 | "zustand": "^4.5" 112 | }, 113 | "engines": { 114 | "node": ">=10" 115 | }, 116 | "peerDependencies": { 117 | "@dfinity/agent": "^1.3", 118 | "@dfinity/auth-client": "^1.3", 119 | "@dfinity/candid": "^1.3", 120 | "@dfinity/identity": "^1.3", 121 | "@dfinity/principal": "^1.3" 122 | } 123 | }, 124 | "node_modules/@ic-reactor/react": { 125 | "version": "1.8.2", 126 | "resolved": "https://registry.npmjs.org/@ic-reactor/react/-/react-1.8.2.tgz", 127 | "integrity": "sha512-7pFq7o1gL+7eSts+pG5w+uPp0L3MoQr9BgfGJ4A3xb6UrRKY1sHQg/L+VSX1MLqVWgjXpBLVbCRjljrXpn0Cyw==", 128 | "license": "MIT", 129 | "dependencies": { 130 | "@ic-reactor/core": "^1.8.0", 131 | "zustand-utils": "^1.3" 132 | }, 133 | "engines": { 134 | "node": ">=10" 135 | }, 136 | "peerDependencies": { 137 | "@dfinity/agent": "^1.3", 138 | "@dfinity/auth-client": "^1.3", 139 | "@dfinity/candid": "^1.3", 140 | "@dfinity/identity": "^1.3", 141 | "@dfinity/principal": "^1.3", 142 | "react": ">=16.8", 143 | "zustand": "4.5" 144 | } 145 | }, 146 | "node_modules/@next/env": { 147 | "version": "14.2.5", 148 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", 149 | "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==", 150 | "license": "MIT" 151 | }, 152 | "node_modules/@next/swc-darwin-arm64": { 153 | "version": "14.2.5", 154 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", 155 | "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", 156 | "cpu": [ 157 | "arm64" 158 | ], 159 | "license": "MIT", 160 | "optional": true, 161 | "os": [ 162 | "darwin" 163 | ], 164 | "engines": { 165 | "node": ">= 10" 166 | } 167 | }, 168 | "node_modules/@next/swc-darwin-x64": { 169 | "version": "14.2.5", 170 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", 171 | "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", 172 | "cpu": [ 173 | "x64" 174 | ], 175 | "license": "MIT", 176 | "optional": true, 177 | "os": [ 178 | "darwin" 179 | ], 180 | "engines": { 181 | "node": ">= 10" 182 | } 183 | }, 184 | "node_modules/@next/swc-linux-arm64-gnu": { 185 | "version": "14.2.5", 186 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", 187 | "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", 188 | "cpu": [ 189 | "arm64" 190 | ], 191 | "license": "MIT", 192 | "optional": true, 193 | "os": [ 194 | "linux" 195 | ], 196 | "engines": { 197 | "node": ">= 10" 198 | } 199 | }, 200 | "node_modules/@next/swc-linux-arm64-musl": { 201 | "version": "14.2.5", 202 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", 203 | "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", 204 | "cpu": [ 205 | "arm64" 206 | ], 207 | "license": "MIT", 208 | "optional": true, 209 | "os": [ 210 | "linux" 211 | ], 212 | "engines": { 213 | "node": ">= 10" 214 | } 215 | }, 216 | "node_modules/@next/swc-linux-x64-gnu": { 217 | "version": "14.2.5", 218 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", 219 | "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", 220 | "cpu": [ 221 | "x64" 222 | ], 223 | "license": "MIT", 224 | "optional": true, 225 | "os": [ 226 | "linux" 227 | ], 228 | "engines": { 229 | "node": ">= 10" 230 | } 231 | }, 232 | "node_modules/@next/swc-linux-x64-musl": { 233 | "version": "14.2.5", 234 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", 235 | "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", 236 | "cpu": [ 237 | "x64" 238 | ], 239 | "license": "MIT", 240 | "optional": true, 241 | "os": [ 242 | "linux" 243 | ], 244 | "engines": { 245 | "node": ">= 10" 246 | } 247 | }, 248 | "node_modules/@next/swc-win32-arm64-msvc": { 249 | "version": "14.2.5", 250 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", 251 | "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", 252 | "cpu": [ 253 | "arm64" 254 | ], 255 | "license": "MIT", 256 | "optional": true, 257 | "os": [ 258 | "win32" 259 | ], 260 | "engines": { 261 | "node": ">= 10" 262 | } 263 | }, 264 | "node_modules/@next/swc-win32-ia32-msvc": { 265 | "version": "14.2.5", 266 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", 267 | "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", 268 | "cpu": [ 269 | "ia32" 270 | ], 271 | "license": "MIT", 272 | "optional": true, 273 | "os": [ 274 | "win32" 275 | ], 276 | "engines": { 277 | "node": ">= 10" 278 | } 279 | }, 280 | "node_modules/@next/swc-win32-x64-msvc": { 281 | "version": "14.2.5", 282 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", 283 | "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", 284 | "cpu": [ 285 | "x64" 286 | ], 287 | "license": "MIT", 288 | "optional": true, 289 | "os": [ 290 | "win32" 291 | ], 292 | "engines": { 293 | "node": ">= 10" 294 | } 295 | }, 296 | "node_modules/@noble/curves": { 297 | "version": "1.4.2", 298 | "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", 299 | "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", 300 | "license": "MIT", 301 | "dependencies": { 302 | "@noble/hashes": "1.4.0" 303 | }, 304 | "funding": { 305 | "url": "https://paulmillr.com/funding/" 306 | } 307 | }, 308 | "node_modules/@noble/hashes": { 309 | "version": "1.4.0", 310 | "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", 311 | "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", 312 | "license": "MIT", 313 | "engines": { 314 | "node": ">= 16" 315 | }, 316 | "funding": { 317 | "url": "https://paulmillr.com/funding/" 318 | } 319 | }, 320 | "node_modules/@peculiar/asn1-schema": { 321 | "version": "2.3.8", 322 | "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", 323 | "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", 324 | "license": "MIT", 325 | "peer": true, 326 | "dependencies": { 327 | "asn1js": "^3.0.5", 328 | "pvtsutils": "^1.3.5", 329 | "tslib": "^2.6.2" 330 | } 331 | }, 332 | "node_modules/@peculiar/json-schema": { 333 | "version": "1.1.12", 334 | "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", 335 | "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", 336 | "license": "MIT", 337 | "peer": true, 338 | "dependencies": { 339 | "tslib": "^2.0.0" 340 | }, 341 | "engines": { 342 | "node": ">=8.0.0" 343 | } 344 | }, 345 | "node_modules/@peculiar/webcrypto": { 346 | "version": "1.5.0", 347 | "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", 348 | "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", 349 | "license": "MIT", 350 | "peer": true, 351 | "dependencies": { 352 | "@peculiar/asn1-schema": "^2.3.8", 353 | "@peculiar/json-schema": "^1.1.12", 354 | "pvtsutils": "^1.3.5", 355 | "tslib": "^2.6.2", 356 | "webcrypto-core": "^1.8.0" 357 | }, 358 | "engines": { 359 | "node": ">=10.12.0" 360 | } 361 | }, 362 | "node_modules/@swc/counter": { 363 | "version": "0.1.3", 364 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 365 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", 366 | "license": "Apache-2.0" 367 | }, 368 | "node_modules/@swc/helpers": { 369 | "version": "0.5.5", 370 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", 371 | "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", 372 | "license": "Apache-2.0", 373 | "dependencies": { 374 | "@swc/counter": "^0.1.3", 375 | "tslib": "^2.4.0" 376 | } 377 | }, 378 | "node_modules/@types/node": { 379 | "version": "20.14.10", 380 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", 381 | "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", 382 | "dev": true, 383 | "license": "MIT", 384 | "dependencies": { 385 | "undici-types": "~5.26.4" 386 | } 387 | }, 388 | "node_modules/@types/prop-types": { 389 | "version": "15.7.11", 390 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", 391 | "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", 392 | "devOptional": true 393 | }, 394 | "node_modules/@types/react": { 395 | "version": "18.3.3", 396 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", 397 | "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", 398 | "devOptional": true, 399 | "license": "MIT", 400 | "dependencies": { 401 | "@types/prop-types": "*", 402 | "csstype": "^3.0.2" 403 | } 404 | }, 405 | "node_modules/asn1js": { 406 | "version": "3.0.5", 407 | "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", 408 | "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", 409 | "license": "BSD-3-Clause", 410 | "peer": true, 411 | "dependencies": { 412 | "pvtsutils": "^1.3.2", 413 | "pvutils": "^1.1.3", 414 | "tslib": "^2.4.0" 415 | }, 416 | "engines": { 417 | "node": ">=12.0.0" 418 | } 419 | }, 420 | "node_modules/base64-arraybuffer": { 421 | "version": "0.2.0", 422 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", 423 | "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", 424 | "engines": { 425 | "node": ">= 0.6.0" 426 | } 427 | }, 428 | "node_modules/base64-js": { 429 | "version": "1.5.1", 430 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 431 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 432 | "funding": [ 433 | { 434 | "type": "github", 435 | "url": "https://github.com/sponsors/feross" 436 | }, 437 | { 438 | "type": "patreon", 439 | "url": "https://www.patreon.com/feross" 440 | }, 441 | { 442 | "type": "consulting", 443 | "url": "https://feross.org/support" 444 | } 445 | ], 446 | "license": "MIT" 447 | }, 448 | "node_modules/bignumber.js": { 449 | "version": "9.1.2", 450 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", 451 | "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", 452 | "license": "MIT", 453 | "engines": { 454 | "node": "*" 455 | } 456 | }, 457 | "node_modules/borc": { 458 | "version": "2.1.2", 459 | "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", 460 | "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", 461 | "license": "MIT", 462 | "dependencies": { 463 | "bignumber.js": "^9.0.0", 464 | "buffer": "^5.5.0", 465 | "commander": "^2.15.0", 466 | "ieee754": "^1.1.13", 467 | "iso-url": "~0.4.7", 468 | "json-text-sequence": "~0.1.0", 469 | "readable-stream": "^3.6.0" 470 | }, 471 | "engines": { 472 | "node": ">=4" 473 | } 474 | }, 475 | "node_modules/borc/node_modules/buffer": { 476 | "version": "5.7.1", 477 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 478 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 479 | "funding": [ 480 | { 481 | "type": "github", 482 | "url": "https://github.com/sponsors/feross" 483 | }, 484 | { 485 | "type": "patreon", 486 | "url": "https://www.patreon.com/feross" 487 | }, 488 | { 489 | "type": "consulting", 490 | "url": "https://feross.org/support" 491 | } 492 | ], 493 | "license": "MIT", 494 | "dependencies": { 495 | "base64-js": "^1.3.1", 496 | "ieee754": "^1.1.13" 497 | } 498 | }, 499 | "node_modules/buffer": { 500 | "version": "6.0.3", 501 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 502 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 503 | "funding": [ 504 | { 505 | "type": "github", 506 | "url": "https://github.com/sponsors/feross" 507 | }, 508 | { 509 | "type": "patreon", 510 | "url": "https://www.patreon.com/feross" 511 | }, 512 | { 513 | "type": "consulting", 514 | "url": "https://feross.org/support" 515 | } 516 | ], 517 | "license": "MIT", 518 | "dependencies": { 519 | "base64-js": "^1.3.1", 520 | "ieee754": "^1.2.1" 521 | } 522 | }, 523 | "node_modules/busboy": { 524 | "version": "1.6.0", 525 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 526 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 527 | "dependencies": { 528 | "streamsearch": "^1.1.0" 529 | }, 530 | "engines": { 531 | "node": ">=10.16.0" 532 | } 533 | }, 534 | "node_modules/caniuse-lite": { 535 | "version": "1.0.30001593", 536 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", 537 | "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", 538 | "funding": [ 539 | { 540 | "type": "opencollective", 541 | "url": "https://opencollective.com/browserslist" 542 | }, 543 | { 544 | "type": "tidelift", 545 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 546 | }, 547 | { 548 | "type": "github", 549 | "url": "https://github.com/sponsors/ai" 550 | } 551 | ] 552 | }, 553 | "node_modules/client-only": { 554 | "version": "0.0.1", 555 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 556 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 557 | }, 558 | "node_modules/commander": { 559 | "version": "2.20.3", 560 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 561 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 562 | "license": "MIT" 563 | }, 564 | "node_modules/csstype": { 565 | "version": "3.1.3", 566 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 567 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 568 | "devOptional": true 569 | }, 570 | "node_modules/delimit-stream": { 571 | "version": "0.1.0", 572 | "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", 573 | "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", 574 | "license": "BSD-2-Clause" 575 | }, 576 | "node_modules/dotenv": { 577 | "version": "16.4.5", 578 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 579 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 580 | "dev": true, 581 | "license": "BSD-2-Clause", 582 | "engines": { 583 | "node": ">=12" 584 | }, 585 | "funding": { 586 | "url": "https://dotenvx.com" 587 | } 588 | }, 589 | "node_modules/fast-deep-equal": { 590 | "version": "3.1.3", 591 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 592 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 593 | }, 594 | "node_modules/graceful-fs": { 595 | "version": "4.2.11", 596 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 597 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 598 | }, 599 | "node_modules/idb": { 600 | "version": "7.1.1", 601 | "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", 602 | "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", 603 | "license": "ISC" 604 | }, 605 | "node_modules/ieee754": { 606 | "version": "1.2.1", 607 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 608 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 609 | "funding": [ 610 | { 611 | "type": "github", 612 | "url": "https://github.com/sponsors/feross" 613 | }, 614 | { 615 | "type": "patreon", 616 | "url": "https://www.patreon.com/feross" 617 | }, 618 | { 619 | "type": "consulting", 620 | "url": "https://feross.org/support" 621 | } 622 | ], 623 | "license": "BSD-3-Clause" 624 | }, 625 | "node_modules/inherits": { 626 | "version": "2.0.4", 627 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 628 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 629 | "license": "ISC" 630 | }, 631 | "node_modules/iso-url": { 632 | "version": "0.4.7", 633 | "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", 634 | "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", 635 | "license": "MIT", 636 | "engines": { 637 | "node": ">=10" 638 | } 639 | }, 640 | "node_modules/js-tokens": { 641 | "version": "4.0.0", 642 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 643 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 644 | }, 645 | "node_modules/json-text-sequence": { 646 | "version": "0.1.1", 647 | "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", 648 | "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", 649 | "license": "MIT", 650 | "dependencies": { 651 | "delimit-stream": "0.1.0" 652 | } 653 | }, 654 | "node_modules/loose-envify": { 655 | "version": "1.4.0", 656 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 657 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 658 | "dependencies": { 659 | "js-tokens": "^3.0.0 || ^4.0.0" 660 | }, 661 | "bin": { 662 | "loose-envify": "cli.js" 663 | } 664 | }, 665 | "node_modules/nanoid": { 666 | "version": "3.3.7", 667 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 668 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 669 | "funding": [ 670 | { 671 | "type": "github", 672 | "url": "https://github.com/sponsors/ai" 673 | } 674 | ], 675 | "bin": { 676 | "nanoid": "bin/nanoid.cjs" 677 | }, 678 | "engines": { 679 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 680 | } 681 | }, 682 | "node_modules/next": { 683 | "version": "14.2.5", 684 | "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", 685 | "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", 686 | "license": "MIT", 687 | "dependencies": { 688 | "@next/env": "14.2.5", 689 | "@swc/helpers": "0.5.5", 690 | "busboy": "1.6.0", 691 | "caniuse-lite": "^1.0.30001579", 692 | "graceful-fs": "^4.2.11", 693 | "postcss": "8.4.31", 694 | "styled-jsx": "5.1.1" 695 | }, 696 | "bin": { 697 | "next": "dist/bin/next" 698 | }, 699 | "engines": { 700 | "node": ">=18.17.0" 701 | }, 702 | "optionalDependencies": { 703 | "@next/swc-darwin-arm64": "14.2.5", 704 | "@next/swc-darwin-x64": "14.2.5", 705 | "@next/swc-linux-arm64-gnu": "14.2.5", 706 | "@next/swc-linux-arm64-musl": "14.2.5", 707 | "@next/swc-linux-x64-gnu": "14.2.5", 708 | "@next/swc-linux-x64-musl": "14.2.5", 709 | "@next/swc-win32-arm64-msvc": "14.2.5", 710 | "@next/swc-win32-ia32-msvc": "14.2.5", 711 | "@next/swc-win32-x64-msvc": "14.2.5" 712 | }, 713 | "peerDependencies": { 714 | "@opentelemetry/api": "^1.1.0", 715 | "@playwright/test": "^1.41.2", 716 | "react": "^18.2.0", 717 | "react-dom": "^18.2.0", 718 | "sass": "^1.3.0" 719 | }, 720 | "peerDependenciesMeta": { 721 | "@opentelemetry/api": { 722 | "optional": true 723 | }, 724 | "@playwright/test": { 725 | "optional": true 726 | }, 727 | "sass": { 728 | "optional": true 729 | } 730 | } 731 | }, 732 | "node_modules/picocolors": { 733 | "version": "1.0.0", 734 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 735 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 736 | }, 737 | "node_modules/postcss": { 738 | "version": "8.4.31", 739 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 740 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 741 | "funding": [ 742 | { 743 | "type": "opencollective", 744 | "url": "https://opencollective.com/postcss/" 745 | }, 746 | { 747 | "type": "tidelift", 748 | "url": "https://tidelift.com/funding/github/npm/postcss" 749 | }, 750 | { 751 | "type": "github", 752 | "url": "https://github.com/sponsors/ai" 753 | } 754 | ], 755 | "dependencies": { 756 | "nanoid": "^3.3.6", 757 | "picocolors": "^1.0.0", 758 | "source-map-js": "^1.0.2" 759 | }, 760 | "engines": { 761 | "node": "^10 || ^12 || >=14" 762 | } 763 | }, 764 | "node_modules/pvtsutils": { 765 | "version": "1.3.5", 766 | "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", 767 | "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", 768 | "license": "MIT", 769 | "peer": true, 770 | "dependencies": { 771 | "tslib": "^2.6.1" 772 | } 773 | }, 774 | "node_modules/pvutils": { 775 | "version": "1.1.3", 776 | "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", 777 | "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", 778 | "license": "MIT", 779 | "peer": true, 780 | "engines": { 781 | "node": ">=6.0.0" 782 | } 783 | }, 784 | "node_modules/react": { 785 | "version": "18.3.1", 786 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", 787 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", 788 | "license": "MIT", 789 | "dependencies": { 790 | "loose-envify": "^1.1.0" 791 | }, 792 | "engines": { 793 | "node": ">=0.10.0" 794 | } 795 | }, 796 | "node_modules/react-dom": { 797 | "version": "18.3.1", 798 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", 799 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", 800 | "license": "MIT", 801 | "dependencies": { 802 | "loose-envify": "^1.1.0", 803 | "scheduler": "^0.23.2" 804 | }, 805 | "peerDependencies": { 806 | "react": "^18.3.1" 807 | } 808 | }, 809 | "node_modules/readable-stream": { 810 | "version": "3.6.2", 811 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 812 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 813 | "license": "MIT", 814 | "dependencies": { 815 | "inherits": "^2.0.3", 816 | "string_decoder": "^1.1.1", 817 | "util-deprecate": "^1.0.1" 818 | }, 819 | "engines": { 820 | "node": ">= 6" 821 | } 822 | }, 823 | "node_modules/regenerator-runtime": { 824 | "version": "0.14.1", 825 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 826 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 827 | }, 828 | "node_modules/safe-buffer": { 829 | "version": "5.2.1", 830 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 831 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 832 | "funding": [ 833 | { 834 | "type": "github", 835 | "url": "https://github.com/sponsors/feross" 836 | }, 837 | { 838 | "type": "patreon", 839 | "url": "https://www.patreon.com/feross" 840 | }, 841 | { 842 | "type": "consulting", 843 | "url": "https://feross.org/support" 844 | } 845 | ], 846 | "license": "MIT" 847 | }, 848 | "node_modules/scheduler": { 849 | "version": "0.23.2", 850 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", 851 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", 852 | "license": "MIT", 853 | "dependencies": { 854 | "loose-envify": "^1.1.0" 855 | } 856 | }, 857 | "node_modules/simple-cbor": { 858 | "version": "0.4.1", 859 | "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", 860 | "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", 861 | "license": "ISC" 862 | }, 863 | "node_modules/source-map-js": { 864 | "version": "1.0.2", 865 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 866 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 867 | "engines": { 868 | "node": ">=0.10.0" 869 | } 870 | }, 871 | "node_modules/streamsearch": { 872 | "version": "1.1.0", 873 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 874 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 875 | "engines": { 876 | "node": ">=10.0.0" 877 | } 878 | }, 879 | "node_modules/string_decoder": { 880 | "version": "1.3.0", 881 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 882 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 883 | "license": "MIT", 884 | "dependencies": { 885 | "safe-buffer": "~5.2.0" 886 | } 887 | }, 888 | "node_modules/styled-jsx": { 889 | "version": "5.1.1", 890 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 891 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 892 | "dependencies": { 893 | "client-only": "0.0.1" 894 | }, 895 | "engines": { 896 | "node": ">= 12.0.0" 897 | }, 898 | "peerDependencies": { 899 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 900 | }, 901 | "peerDependenciesMeta": { 902 | "@babel/core": { 903 | "optional": true 904 | }, 905 | "babel-plugin-macros": { 906 | "optional": true 907 | } 908 | } 909 | }, 910 | "node_modules/tslib": { 911 | "version": "2.6.2", 912 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 913 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 914 | }, 915 | "node_modules/typescript": { 916 | "version": "5.5.3", 917 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", 918 | "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", 919 | "dev": true, 920 | "license": "Apache-2.0", 921 | "bin": { 922 | "tsc": "bin/tsc", 923 | "tsserver": "bin/tsserver" 924 | }, 925 | "engines": { 926 | "node": ">=14.17" 927 | } 928 | }, 929 | "node_modules/undici-types": { 930 | "version": "5.26.5", 931 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 932 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 933 | "dev": true 934 | }, 935 | "node_modules/use-sync-external-store": { 936 | "version": "1.2.0", 937 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 938 | "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 939 | "peerDependencies": { 940 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 941 | } 942 | }, 943 | "node_modules/util-deprecate": { 944 | "version": "1.0.2", 945 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 946 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 947 | "license": "MIT" 948 | }, 949 | "node_modules/webcrypto-core": { 950 | "version": "1.8.0", 951 | "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.0.tgz", 952 | "integrity": "sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==", 953 | "license": "MIT", 954 | "peer": true, 955 | "dependencies": { 956 | "@peculiar/asn1-schema": "^2.3.8", 957 | "@peculiar/json-schema": "^1.1.12", 958 | "asn1js": "^3.0.1", 959 | "pvtsutils": "^1.3.5", 960 | "tslib": "^2.6.2" 961 | } 962 | }, 963 | "node_modules/zustand": { 964 | "version": "4.5.2", 965 | "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", 966 | "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", 967 | "dependencies": { 968 | "use-sync-external-store": "1.2.0" 969 | }, 970 | "engines": { 971 | "node": ">=12.7.0" 972 | }, 973 | "peerDependencies": { 974 | "@types/react": ">=16.8", 975 | "immer": ">=9.0.6", 976 | "react": ">=16.8" 977 | }, 978 | "peerDependenciesMeta": { 979 | "@types/react": { 980 | "optional": true 981 | }, 982 | "immer": { 983 | "optional": true 984 | }, 985 | "react": { 986 | "optional": true 987 | } 988 | } 989 | }, 990 | "node_modules/zustand-utils": { 991 | "version": "1.3.2", 992 | "resolved": "https://registry.npmjs.org/zustand-utils/-/zustand-utils-1.3.2.tgz", 993 | "integrity": "sha512-c+X8whiqWKgl6r3jzzlNR6vp5ZHsqfIxbZN2uyv+GlqATKh//6GIneywm7tcq+8XZXINT8N9tnDH8npPdXDLEA==", 994 | "dependencies": { 995 | "@babel/runtime": "^7", 996 | "fast-deep-equal": "^3" 997 | }, 998 | "peerDependencies": { 999 | "react": ">=16.8", 1000 | "zustand": ">=4.4.1" 1001 | } 1002 | } 1003 | } 1004 | } 1005 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ic-rust-nextjs", 3 | "version": "1.0.1", 4 | "author": "b3hr4d ", 5 | "description": "Internet Computer Rust + NextJS Template", 6 | "keywords": [ 7 | "nextjs", 8 | "rust", 9 | "internet computer", 10 | "icp", 11 | "starter", 12 | "dfinity" 13 | ], 14 | "scripts": { 15 | "install:all": "(yarn -v && yarn || npm install) && npm run ic-wasm:install && npm run candid:install", 16 | "candid:install": "cargo install candid-extractor", 17 | "ic-wasm:install": "cargo install ic-wasm", 18 | "build": "next build", 19 | "start": "next start", 20 | "export": "next build", 21 | "dev": "next dev", 22 | "deploy": "dfx deploy", 23 | "dfx:stop": "dfx stop", 24 | "dfx:pull": "dfx deps pull && dfx deps init", 25 | "dfx:start": "dfx start --background --clean", 26 | "dfx:build": "sh ./predeploy.sh && dfx build", 27 | "dfx:identity": "dfx deps deploy internet_identity", 28 | "dfx:generate": "dfx generate" 29 | }, 30 | "dependencies": { 31 | "@ic-reactor/react": "^1.2", 32 | "next": "^14.2.5", 33 | "react": "^18.3.1", 34 | "react-dom": "^18.3.1" 35 | }, 36 | "devDependencies": { 37 | "@types/node": "^20.14.10", 38 | "@types/react": "^18.3.3", 39 | "dotenv": "^16.4.5", 40 | "typescript": "^5.5.3" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /predeploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eu 3 | 4 | backend_dir="./backend" 5 | target_dir="./target/wasm32-unknown-unknown/release" 6 | 7 | yellow='\033[1;33m' 8 | green='\033[0;32m' 9 | no_color='\033[0m' 10 | 11 | for app_root in "$backend_dir"/*; do 12 | package=$(basename "$app_root") 13 | did_file="$app_root/$package.did" 14 | 15 | echo "${green}Building $package in $app_root${no_color}" 16 | cargo build --manifest-path="$app_root/Cargo.toml" \ 17 | --target wasm32-unknown-unknown \ 18 | --release \ 19 | --package "$package" 20 | echo "Size of $package.wasm: $(ls -lh "$target_dir/$package.wasm" | awk '{print $5}')" 21 | 22 | if command -v candid-extractor >/dev/null 2>&1; then 23 | echo "${green}Generating Candid file for $package${no_color}" 24 | candid-extractor "$target_dir/$package.wasm" 2>/dev/null > "$did_file" 25 | echo "Size of $package.did: $(ls -lh "$did_file" | awk '{print $5}')" 26 | else 27 | echo "${yellow}candid-extractor not found. Skipping generating $package.did.${no_color}" 28 | fi 29 | 30 | # Check if ic-wasm is installed before attempting to shrink the wasm file 31 | if command -v ic-wasm >/dev/null 2>&1; then 32 | # you can install ic-wasm via `cargo install ic-wasm` for smaller wasm files 33 | echo "${green}Shrinking $package.wasm${no_color}" 34 | ic-wasm "$target_dir/$package.wasm" -o "$target_dir/$package.wasm" shrink 35 | echo "Size of shrunk $package.wasm: $(ls -lh "$target_dir/$package.wasm" | awk '{print $5}')" 36 | else 37 | echo "${yellow}ic-wasm not found. Skipping shrinking $package.${no_color}" 38 | fi 39 | 40 | dfx generate "$package" 41 | 42 | done 43 | -------------------------------------------------------------------------------- /public/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/b3hr4d/ic-rust-nextjs/fe8bc6c108cabed030aaab400307a4629950ec73/public/demo.png -------------------------------------------------------------------------------- /public/icp-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/components/Greeting.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react" 2 | import { useQueryCall } from "service/hello" 3 | 4 | interface GreetingProps {} 5 | 6 | const Greeting: React.FC = ({}) => { 7 | const [name, setName] = useState("") 8 | 9 | const { call, data, error, loading } = useQueryCall({ 10 | refetchOnMount: false, 11 | functionName: "greet", 12 | args: [name] 13 | }) 14 | 15 | function onChangeName(e: React.ChangeEvent) { 16 | const newName = e.target.value 17 | setName(newName) 18 | } 19 | 20 | return ( 21 |
22 |
23 |

Greeting

24 | 25 | 32 | 33 |
34 |
35 | 36 | {loading ? ( 37 | Loading... 38 | ) : error ? ( 39 | {error.message} 40 | ) : data ? ( 41 | {data} 42 | ) : null} 43 |
44 |
45 | ) 46 | } 47 | 48 | export default Greeting 49 | -------------------------------------------------------------------------------- /src/declarations/hello/hello.did.d.ts: -------------------------------------------------------------------------------- 1 | import type { Principal } from '@dfinity/principal'; 2 | import type { ActorMethod } from '@dfinity/agent'; 3 | import type { IDL } from '@dfinity/candid'; 4 | 5 | export interface _SERVICE { 'greet' : ActorMethod<[string], string> } 6 | export declare const idlFactory: IDL.InterfaceFactory; 7 | export declare const init: ({ IDL }: { IDL: IDL }) => IDL.Type[]; 8 | -------------------------------------------------------------------------------- /src/declarations/hello/hello.did.js: -------------------------------------------------------------------------------- 1 | export const idlFactory = ({ IDL }) => { 2 | return IDL.Service({ 'greet' : IDL.Func([IDL.Text], [IDL.Text], ['query']) }); 3 | }; 4 | export const init = ({ IDL }) => { return []; }; 5 | -------------------------------------------------------------------------------- /src/declarations/hello/index.d.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | ActorSubclass, 3 | HttpAgentOptions, 4 | ActorConfig, 5 | Agent, 6 | } from "@dfinity/agent"; 7 | import type { Principal } from "@dfinity/principal"; 8 | import type { IDL } from "@dfinity/candid"; 9 | 10 | import { _SERVICE } from './hello.did'; 11 | 12 | export declare const idlFactory: IDL.InterfaceFactory; 13 | export declare const canisterId: string; 14 | 15 | export declare interface CreateActorOptions { 16 | /** 17 | * @see {@link Agent} 18 | */ 19 | agent?: Agent; 20 | /** 21 | * @see {@link HttpAgentOptions} 22 | */ 23 | agentOptions?: HttpAgentOptions; 24 | /** 25 | * @see {@link ActorConfig} 26 | */ 27 | actorOptions?: ActorConfig; 28 | } 29 | 30 | /** 31 | * Intializes an {@link ActorSubclass}, configured with the provided SERVICE interface of a canister. 32 | * @constructs {@link ActorSubClass} 33 | * @param {string | Principal} canisterId - ID of the canister the {@link Actor} will talk to 34 | * @param {CreateActorOptions} options - see {@link CreateActorOptions} 35 | * @param {CreateActorOptions["agent"]} options.agent - a pre-configured agent you'd like to use. Supercedes agentOptions 36 | * @param {CreateActorOptions["agentOptions"]} options.agentOptions - options to set up a new agent 37 | * @see {@link HttpAgentOptions} 38 | * @param {CreateActorOptions["actorOptions"]} options.actorOptions - options for the Actor 39 | * @see {@link ActorConfig} 40 | */ 41 | export declare const createActor: ( 42 | canisterId: string | Principal, 43 | options?: CreateActorOptions 44 | ) => ActorSubclass<_SERVICE>; 45 | 46 | /** 47 | * Intialized Actor using default settings, ready to talk to a canister using its candid interface 48 | * @constructs {@link ActorSubClass} 49 | */ 50 | export declare const hello: ActorSubclass<_SERVICE>; 51 | -------------------------------------------------------------------------------- /src/declarations/hello/index.js: -------------------------------------------------------------------------------- 1 | import { Actor, HttpAgent } from "@dfinity/agent"; 2 | 3 | // Imports and re-exports candid interface 4 | import { idlFactory } from "./hello.did.js"; 5 | export { idlFactory } from "./hello.did.js"; 6 | 7 | /* CANISTER_ID is replaced by webpack based on node environment 8 | * Note: canister environment variable will be standardized as 9 | * process.env.CANISTER_ID_ 10 | * beginning in dfx 0.15.0 11 | */ 12 | export const canisterId = 13 | process.env.CANISTER_ID_HELLO || 14 | process.env.HELLO_CANISTER_ID; 15 | 16 | export const createActor = (canisterId, options = {}) => { 17 | const agent = options.agent || new HttpAgent({ ...options.agentOptions }); 18 | 19 | if (options.agent && options.agentOptions) { 20 | console.warn( 21 | "Detected both agent and agentOptions passed to createActor. Ignoring agentOptions and proceeding with the provided agent." 22 | ); 23 | } 24 | 25 | // Fetch root key for certificate validation during development 26 | if (process.env.DFX_NETWORK !== "ic") { 27 | agent.fetchRootKey().catch((err) => { 28 | console.warn( 29 | "Unable to fetch root key. Check to ensure that your local replica is running" 30 | ); 31 | console.error(err); 32 | }); 33 | } 34 | 35 | // Creates an actor with using the candid interface and the HttpAgent 36 | return Actor.createActor(idlFactory, { 37 | agent, 38 | canisterId, 39 | ...options.actorOptions, 40 | }); 41 | }; 42 | -------------------------------------------------------------------------------- /src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { AppProps } from "next/app" 2 | import React from "react" 3 | import "styles/global.css" 4 | 5 | const App: React.FC = ({ Component, pageProps }) => { 6 | return 7 | } 8 | 9 | export default App 10 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import Head from "next/head" 2 | 3 | import styles from "styles/Home.module.css" 4 | 5 | import Greeting from "components/Greeting" 6 | import Image from "next/image" 7 | 8 | function HomePage() { 9 | return ( 10 |
11 | 12 | Internet Computer 13 | 14 |
15 |

16 | Welcome to the Internet Computer starter template 17 |

18 | 19 |
20 | 35 |
36 | ) 37 | } 38 | 39 | export default HomePage 40 | -------------------------------------------------------------------------------- /src/service/hello.ts: -------------------------------------------------------------------------------- 1 | import { createReactor } from "@ic-reactor/react" 2 | import { canisterId, hello, idlFactory } from "declarations/hello" 3 | 4 | export const { initialize, useQueryCall } = createReactor({ 5 | canisterId, 6 | idlFactory, 7 | withLocalEnv: true 8 | }) 9 | -------------------------------------------------------------------------------- /src/styles/Home.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100vh; 3 | padding: 0 0.5rem; 4 | } 5 | 6 | .main { 7 | padding: 2rem 0; 8 | flex: 1; 9 | display: flex; 10 | flex-direction: column; 11 | justify-content: center; 12 | align-items: center; 13 | gap: 1rem; 14 | } 15 | 16 | .title { 17 | margin: 0; 18 | line-height: 1.15; 19 | font-size: 2rem; 20 | text-align: center; 21 | } 22 | 23 | .logo { 24 | width: 140px; 25 | } 26 | 27 | .footer { 28 | width: 100%; 29 | height: 50px; 30 | border-top: 1px solid #eaeaea; 31 | display: flex; 32 | justify-content: center; 33 | align-items: center; 34 | } -------------------------------------------------------------------------------- /src/styles/global.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | padding: 0; 4 | margin: 0; 5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 7 | line-height: 1.6; 8 | font-size: 18px; 9 | } 10 | 11 | * { 12 | box-sizing: border-box; 13 | } 14 | 15 | a { 16 | color: #0070f3; 17 | text-decoration: none; 18 | } 19 | 20 | a:hover { 21 | text-decoration: underline; 22 | } 23 | 24 | img { 25 | max-width: 100%; 26 | display: block; 27 | } 28 | 29 | button { 30 | width: 150px; 31 | height: 40px; 32 | font-size: 1rem; 33 | margin-left: 6px; 34 | margin-right: 6px; 35 | } 36 | 37 | section { 38 | padding: 6px; 39 | width: 600px 40 | } 41 | 42 | input { 43 | padding: 4px; 44 | margin: 0px 12px; 45 | width: 200px; 46 | height: 40px; 47 | font-size: 1rem; 48 | } 49 | 50 | label { 51 | font-size: 1.1rem; 52 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "*": ["./src/*"] 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "src/**/*"], 27 | "exclude": ["node_modules", "out"] 28 | } 29 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7": 6 | version "7.24.0" 7 | resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" 8 | integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@dfinity/agent@^1.3", "@dfinity/agent@^1.4.0": 13 | version "1.4.0" 14 | resolved "https://registry.npmjs.org/@dfinity/agent/-/agent-1.4.0.tgz" 15 | integrity sha512-/zgGajZpxtbu+kLXtFx2e9V2+HbMUjrtGWx9ZEwtVwhVxKgVi/2kGQpFRPEDFJ461V7wdTwCig4OkMxVU4shTw== 16 | dependencies: 17 | "@noble/curves" "^1.4.0" 18 | "@noble/hashes" "^1.3.1" 19 | base64-arraybuffer "^0.2.0" 20 | borc "^2.1.1" 21 | buffer "^6.0.3" 22 | simple-cbor "^0.4.1" 23 | 24 | "@dfinity/auth-client@^1.3": 25 | version "1.4.0" 26 | resolved "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-1.4.0.tgz" 27 | integrity sha512-9ImeOAw61SQvHJ+w4RHIuKKUL2xAQDLoce+JhmH3DbJuVvNbZIM5xMW8gHTZVlXaMw3Vhip+a1DPJIGy95r9pA== 28 | dependencies: 29 | idb "^7.0.2" 30 | 31 | "@dfinity/candid@^1.3", "@dfinity/candid@^1.4.0": 32 | version "1.4.0" 33 | resolved "https://registry.npmjs.org/@dfinity/candid/-/candid-1.4.0.tgz" 34 | integrity sha512-PsTJVn63ZM4A/6Xs5coI0zMFevSwJ8hcyh38LdH/92n6wi9UOTis1yc4qL5MZvvRCUAD0c3rVjELL+49E9sPyA== 35 | 36 | "@dfinity/identity@^1.3", "@dfinity/identity@^1.4.0": 37 | version "1.4.0" 38 | resolved "https://registry.npmjs.org/@dfinity/identity/-/identity-1.4.0.tgz" 39 | integrity sha512-4WmMsQSuzfWXmm4s+0FYGbFiQcMGE88Ztg6yFq7aTMtRWuAjhz66Dy1+jRCrXxsoxvDdUvPzsyjkOSpr1AuUYQ== 40 | dependencies: 41 | "@noble/curves" "^1.2.0" 42 | "@noble/hashes" "^1.3.1" 43 | borc "^2.1.1" 44 | 45 | "@dfinity/principal@^1.3", "@dfinity/principal@^1.4.0": 46 | version "1.4.0" 47 | resolved "https://registry.npmjs.org/@dfinity/principal/-/principal-1.4.0.tgz" 48 | integrity sha512-SuTBVlc71ub89ji0WN5/T100zUG2uIMn5x4+We4vS4nJ0R3/Xt89XJsHepjd5SQTSQPOvP7eQ+S8cQKWRz/RkA== 49 | dependencies: 50 | "@noble/hashes" "^1.3.1" 51 | 52 | "@ic-reactor/core@^1.8.0": 53 | version "1.8.0" 54 | resolved "https://registry.npmjs.org/@ic-reactor/core/-/core-1.8.0.tgz" 55 | integrity sha512-5NhsCHKk8OF/ePCgGU9632dDM8AbCbOmKrCMle2tzpAAbueOsqH6pC8EY8LOIljAO0iMETpeKNLqI2E0OND4TA== 56 | dependencies: 57 | "@dfinity/agent" "^1.3" 58 | "@dfinity/auth-client" "^1.3" 59 | "@dfinity/candid" "^1.3" 60 | "@dfinity/identity" "^1.3" 61 | "@dfinity/principal" "^1.3" 62 | zustand "^4.5" 63 | 64 | "@ic-reactor/react@^1.2": 65 | version "1.8.2" 66 | resolved "https://registry.npmjs.org/@ic-reactor/react/-/react-1.8.2.tgz" 67 | integrity sha512-7pFq7o1gL+7eSts+pG5w+uPp0L3MoQr9BgfGJ4A3xb6UrRKY1sHQg/L+VSX1MLqVWgjXpBLVbCRjljrXpn0Cyw== 68 | dependencies: 69 | "@ic-reactor/core" "^1.8.0" 70 | zustand-utils "^1.3" 71 | 72 | "@next/env@14.2.5": 73 | version "14.2.5" 74 | resolved "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz" 75 | integrity sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA== 76 | 77 | "@next/swc-darwin-arm64@14.2.5": 78 | version "14.2.5" 79 | resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz" 80 | integrity sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ== 81 | 82 | "@noble/curves@^1.2.0", "@noble/curves@^1.4.0": 83 | version "1.4.2" 84 | resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" 85 | integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== 86 | dependencies: 87 | "@noble/hashes" "1.4.0" 88 | 89 | "@noble/hashes@^1.3.1", "@noble/hashes@1.4.0": 90 | version "1.4.0" 91 | resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" 92 | integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== 93 | 94 | "@peculiar/asn1-schema@^2.3.8": 95 | version "2.3.8" 96 | resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz" 97 | integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== 98 | dependencies: 99 | asn1js "^3.0.5" 100 | pvtsutils "^1.3.5" 101 | tslib "^2.6.2" 102 | 103 | "@peculiar/json-schema@^1.1.12": 104 | version "1.1.12" 105 | resolved "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz" 106 | integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== 107 | dependencies: 108 | tslib "^2.0.0" 109 | 110 | "@peculiar/webcrypto@^1.4.0": 111 | version "1.5.0" 112 | resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz" 113 | integrity sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg== 114 | dependencies: 115 | "@peculiar/asn1-schema" "^2.3.8" 116 | "@peculiar/json-schema" "^1.1.12" 117 | pvtsutils "^1.3.5" 118 | tslib "^2.6.2" 119 | webcrypto-core "^1.8.0" 120 | 121 | "@swc/counter@^0.1.3": 122 | version "0.1.3" 123 | resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" 124 | integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== 125 | 126 | "@swc/helpers@0.5.5": 127 | version "0.5.5" 128 | resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" 129 | integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== 130 | dependencies: 131 | "@swc/counter" "^0.1.3" 132 | tslib "^2.4.0" 133 | 134 | "@types/node@^20.14.10": 135 | version "20.14.10" 136 | resolved "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz" 137 | integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== 138 | dependencies: 139 | undici-types "~5.26.4" 140 | 141 | "@types/prop-types@*": 142 | version "15.7.11" 143 | resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" 144 | integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== 145 | 146 | "@types/react@^18.3.3", "@types/react@>=16.8": 147 | version "18.3.3" 148 | resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz" 149 | integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== 150 | dependencies: 151 | "@types/prop-types" "*" 152 | csstype "^3.0.2" 153 | 154 | asn1js@^3.0.1, asn1js@^3.0.5: 155 | version "3.0.5" 156 | resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz" 157 | integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== 158 | dependencies: 159 | pvtsutils "^1.3.2" 160 | pvutils "^1.1.3" 161 | tslib "^2.4.0" 162 | 163 | base64-arraybuffer@^0.2.0: 164 | version "0.2.0" 165 | resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz" 166 | integrity sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ== 167 | 168 | base64-js@^1.3.1: 169 | version "1.5.1" 170 | resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 171 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 172 | 173 | bignumber.js@^9.0.0: 174 | version "9.1.2" 175 | resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" 176 | integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== 177 | 178 | borc@^2.1.1: 179 | version "2.1.2" 180 | resolved "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz" 181 | integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== 182 | dependencies: 183 | bignumber.js "^9.0.0" 184 | buffer "^5.5.0" 185 | commander "^2.15.0" 186 | ieee754 "^1.1.13" 187 | iso-url "~0.4.7" 188 | json-text-sequence "~0.1.0" 189 | readable-stream "^3.6.0" 190 | 191 | buffer@^5.5.0: 192 | version "5.7.1" 193 | resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" 194 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 195 | dependencies: 196 | base64-js "^1.3.1" 197 | ieee754 "^1.1.13" 198 | 199 | buffer@^6.0.3: 200 | version "6.0.3" 201 | resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" 202 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 203 | dependencies: 204 | base64-js "^1.3.1" 205 | ieee754 "^1.2.1" 206 | 207 | busboy@1.6.0: 208 | version "1.6.0" 209 | resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" 210 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 211 | dependencies: 212 | streamsearch "^1.1.0" 213 | 214 | caniuse-lite@^1.0.30001579: 215 | version "1.0.30001593" 216 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz" 217 | integrity sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ== 218 | 219 | client-only@0.0.1: 220 | version "0.0.1" 221 | resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" 222 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== 223 | 224 | commander@^2.15.0: 225 | version "2.20.3" 226 | resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" 227 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 228 | 229 | csstype@^3.0.2: 230 | version "3.1.3" 231 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" 232 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 233 | 234 | delimit-stream@0.1.0: 235 | version "0.1.0" 236 | resolved "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz" 237 | integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== 238 | 239 | dotenv@^16.4.5: 240 | version "16.4.5" 241 | resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" 242 | integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 243 | 244 | fast-deep-equal@^3: 245 | version "3.1.3" 246 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 247 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 248 | 249 | graceful-fs@^4.2.11: 250 | version "4.2.11" 251 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 252 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 253 | 254 | idb@^7.0.2: 255 | version "7.1.1" 256 | resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" 257 | integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== 258 | 259 | ieee754@^1.1.13, ieee754@^1.2.1: 260 | version "1.2.1" 261 | resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" 262 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 263 | 264 | inherits@^2.0.3: 265 | version "2.0.4" 266 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 267 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 268 | 269 | iso-url@~0.4.7: 270 | version "0.4.7" 271 | resolved "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz" 272 | integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== 273 | 274 | "js-tokens@^3.0.0 || ^4.0.0": 275 | version "4.0.0" 276 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 277 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 278 | 279 | json-text-sequence@~0.1.0: 280 | version "0.1.1" 281 | resolved "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz" 282 | integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== 283 | dependencies: 284 | delimit-stream "0.1.0" 285 | 286 | loose-envify@^1.1.0: 287 | version "1.4.0" 288 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 289 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 290 | dependencies: 291 | js-tokens "^3.0.0 || ^4.0.0" 292 | 293 | nanoid@^3.3.6: 294 | version "3.3.7" 295 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" 296 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 297 | 298 | next@^14.2.5: 299 | version "14.2.5" 300 | resolved "https://registry.npmjs.org/next/-/next-14.2.5.tgz" 301 | integrity sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA== 302 | dependencies: 303 | "@next/env" "14.2.5" 304 | "@swc/helpers" "0.5.5" 305 | busboy "1.6.0" 306 | caniuse-lite "^1.0.30001579" 307 | graceful-fs "^4.2.11" 308 | postcss "8.4.31" 309 | styled-jsx "5.1.1" 310 | optionalDependencies: 311 | "@next/swc-darwin-arm64" "14.2.5" 312 | "@next/swc-darwin-x64" "14.2.5" 313 | "@next/swc-linux-arm64-gnu" "14.2.5" 314 | "@next/swc-linux-arm64-musl" "14.2.5" 315 | "@next/swc-linux-x64-gnu" "14.2.5" 316 | "@next/swc-linux-x64-musl" "14.2.5" 317 | "@next/swc-win32-arm64-msvc" "14.2.5" 318 | "@next/swc-win32-ia32-msvc" "14.2.5" 319 | "@next/swc-win32-x64-msvc" "14.2.5" 320 | 321 | picocolors@^1.0.0: 322 | version "1.0.0" 323 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 324 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 325 | 326 | postcss@8.4.31: 327 | version "8.4.31" 328 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" 329 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 330 | dependencies: 331 | nanoid "^3.3.6" 332 | picocolors "^1.0.0" 333 | source-map-js "^1.0.2" 334 | 335 | pvtsutils@^1.3.2, pvtsutils@^1.3.5: 336 | version "1.3.5" 337 | resolved "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz" 338 | integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== 339 | dependencies: 340 | tslib "^2.6.1" 341 | 342 | pvutils@^1.1.3: 343 | version "1.1.3" 344 | resolved "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz" 345 | integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== 346 | 347 | react-dom@^18.2.0, react-dom@^18.3.1: 348 | version "18.3.1" 349 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" 350 | integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== 351 | dependencies: 352 | loose-envify "^1.1.0" 353 | scheduler "^0.23.2" 354 | 355 | "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.8: 356 | version "18.3.1" 357 | resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" 358 | integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== 359 | dependencies: 360 | loose-envify "^1.1.0" 361 | 362 | readable-stream@^3.6.0: 363 | version "3.6.2" 364 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" 365 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 366 | dependencies: 367 | inherits "^2.0.3" 368 | string_decoder "^1.1.1" 369 | util-deprecate "^1.0.1" 370 | 371 | regenerator-runtime@^0.14.0: 372 | version "0.14.1" 373 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" 374 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 375 | 376 | safe-buffer@~5.2.0: 377 | version "5.2.1" 378 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 379 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 380 | 381 | scheduler@^0.23.2: 382 | version "0.23.2" 383 | resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" 384 | integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== 385 | dependencies: 386 | loose-envify "^1.1.0" 387 | 388 | simple-cbor@^0.4.1: 389 | version "0.4.1" 390 | resolved "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz" 391 | integrity sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w== 392 | 393 | source-map-js@^1.0.2: 394 | version "1.0.2" 395 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 396 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 397 | 398 | streamsearch@^1.1.0: 399 | version "1.1.0" 400 | resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" 401 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 402 | 403 | string_decoder@^1.1.1: 404 | version "1.3.0" 405 | resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" 406 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 407 | dependencies: 408 | safe-buffer "~5.2.0" 409 | 410 | styled-jsx@5.1.1: 411 | version "5.1.1" 412 | resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" 413 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== 414 | dependencies: 415 | client-only "0.0.1" 416 | 417 | tslib@^2.0.0, tslib@^2.4.0, tslib@^2.6.1, tslib@^2.6.2: 418 | version "2.6.2" 419 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" 420 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 421 | 422 | typescript@^5.5.3: 423 | version "5.5.3" 424 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz" 425 | integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== 426 | 427 | undici-types@~5.26.4: 428 | version "5.26.5" 429 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" 430 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 431 | 432 | use-sync-external-store@1.2.0: 433 | version "1.2.0" 434 | resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" 435 | integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== 436 | 437 | util-deprecate@^1.0.1: 438 | version "1.0.2" 439 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 440 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 441 | 442 | webcrypto-core@^1.8.0: 443 | version "1.8.0" 444 | resolved "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.0.tgz" 445 | integrity sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw== 446 | dependencies: 447 | "@peculiar/asn1-schema" "^2.3.8" 448 | "@peculiar/json-schema" "^1.1.12" 449 | asn1js "^3.0.1" 450 | pvtsutils "^1.3.5" 451 | tslib "^2.6.2" 452 | 453 | zustand-utils@^1.3: 454 | version "1.3.2" 455 | resolved "https://registry.npmjs.org/zustand-utils/-/zustand-utils-1.3.2.tgz" 456 | integrity sha512-c+X8whiqWKgl6r3jzzlNR6vp5ZHsqfIxbZN2uyv+GlqATKh//6GIneywm7tcq+8XZXINT8N9tnDH8npPdXDLEA== 457 | dependencies: 458 | "@babel/runtime" "^7" 459 | fast-deep-equal "^3" 460 | 461 | zustand@^4.5, zustand@>=4.4.1, zustand@4.5: 462 | version "4.5.2" 463 | resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz" 464 | integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== 465 | dependencies: 466 | use-sync-external-store "1.2.0" 467 | --------------------------------------------------------------------------------