diff --git a/backend/package.json b/backend/package.json index 379bccd7..54b018f2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,7 +13,6 @@ }, "devDependencies": { "@testcontainers/postgresql": "^10.8.1", - "@types/big.js": "^6.2.2", "@types/otp-generator": "^4.0.2", "@typescript-eslint/eslint-plugin": "^7.9.0", "@vitest/coverage-istanbul": "^1.4.0", @@ -36,7 +35,7 @@ "typescript": "^5.0.0" }, "dependencies": { - "big.js": "^6.2.1", + "@funkit/api-base": "^0.0.6", "dotenv": "^16.4.5", "drizzle-orm": "^0.30.7", "elliptic": "^6.5.5", diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index 9d6ca13a..1fd22b37 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -5,9 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: - big.js: - specifier: ^6.2.1 - version: 6.2.1 + '@funkit/api-base': + specifier: ^0.0.6 + version: 0.0.6 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -19,7 +19,7 @@ dependencies: version: 6.5.5 fastify: specifier: ^4.26.2 - version: 4.28.0 + version: 4.28.1 fastify-plugin: specifier: ^4.5.1 version: 4.5.1 @@ -31,30 +31,27 @@ dependencies: version: 3.4.4 starknet: specifier: ^6.8.0 - version: 6.10.0 + version: 6.11.0 twilio: specifier: ^5.1.1 - version: 5.2.0 + version: 5.2.2 typescript: specifier: ^5.0.0 - version: 5.5.2 + version: 5.5.3 viem: specifier: ^2.9.21 - version: 2.16.2(typescript@5.5.2)(zod@3.23.8) + version: 2.17.3(typescript@5.5.3)(zod@3.23.8) devDependencies: '@testcontainers/postgresql': specifier: ^10.8.1 - version: 10.10.0 - '@types/big.js': - specifier: ^6.2.2 - version: 6.2.2 + version: 10.10.2 '@types/otp-generator': specifier: ^4.0.2 version: 4.0.2 '@typescript-eslint/eslint-plugin': specifier: ^7.9.0 - version: 7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2) + version: 7.16.0(@typescript-eslint/parser@7.16.0)(eslint@8.57.0)(typescript@5.5.3) '@vitest/coverage-istanbul': specifier: ^1.4.0 version: 1.6.0(vitest@1.6.0) @@ -69,34 +66,34 @@ devDependencies: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.14.1)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@7.16.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2) eslint-plugin-simple-import-sort: specifier: ^12.1.0 - version: 12.1.0(eslint@8.57.0) + version: 12.1.1(eslint@8.57.0) eslint-plugin-unused-imports: specifier: ^3.2.0 - version: 3.2.0(@typescript-eslint/eslint-plugin@7.14.1)(eslint@8.57.0) + version: 3.2.0(@typescript-eslint/eslint-plugin@7.16.0)(eslint@8.57.0) eslint-plugin-vitest: specifier: ^0.5.4 - version: 0.5.4(@typescript-eslint/eslint-plugin@7.14.1)(eslint@8.57.0)(typescript@5.5.2)(vitest@1.6.0) + version: 0.5.4(@typescript-eslint/eslint-plugin@7.16.0)(eslint@8.57.0)(typescript@5.5.3)(vitest@1.6.0) prettier: specifier: ^3.2.5 version: 3.3.2 testcontainers: specifier: ^10.8.1 - version: 10.10.0 + version: 10.10.2 tsx: specifier: ^4.7.2 - version: 4.15.7 + version: 4.16.2 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.2) + version: 4.3.2(typescript@5.5.3) vitest: specifier: ^1.4.0 version: 1.6.0 @@ -954,8 +951,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.1: - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -1005,18 +1002,28 @@ packages: fast-deep-equal: 3.1.3 dev: false - /@hono/node-server@1.11.4: - resolution: {integrity: sha512-8TOiiiAqcFC6f62P7M9p6adQREAlWdVi1awehAwgWW+3R65/rKzHnLARO/Hu/466z01VNViBoogqatqXJMyItA==} + /@funkit/api-base@0.0.6: + resolution: {integrity: sha512-CHl/mmfyTU0fnHj+5WwkhCsMsZ+XOqXH3tnL200AeqNitXzblsDXjA/wpGZDLnNgWCfvJtxZFbeB+zJX+I1eFA==} + dependencies: + '@lifeomic/attempt': 3.1.0 + big.js: 6.2.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@hono/node-server@1.12.0: + resolution: {integrity: sha512-e6oHjNiErRxsZRZBmc2KucuvY3btlO/XPncIpP2X75bRdTilF9GLjm3NHvKKunpJbbJJj31/FoPTksTf8djAVw==} engines: {node: '>=18.14.1'} dev: true - /@hono/zod-validator@0.2.2(hono@4.4.8)(zod@3.23.8): + /@hono/zod-validator@0.2.2(hono@4.4.12)(zod@3.23.8): resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.4.8 + hono: 4.4.12 zod: 3.23.8 dev: true @@ -1084,10 +1091,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - dependencies: - '@noble/hashes': 1.3.2 + /@lifeomic/attempt@3.1.0: + resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} dev: false /@noble/curves@1.3.0: @@ -1102,9 +1107,10 @@ packages: '@noble/hashes': 1.4.0 dev: false - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 dev: false /@noble/hashes@1.3.3: @@ -1143,128 +1149,128 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true - /@rollup/rollup-android-arm-eabi@4.18.0: - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + /@rollup/rollup-android-arm-eabi@4.18.1: + resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.18.0: - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + /@rollup/rollup-android-arm64@4.18.1: + resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.18.0: - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + /@rollup/rollup-darwin-arm64@4.18.1: + resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.18.0: - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + /@rollup/rollup-darwin-x64@4.18.1: + resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.18.0: - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + /@rollup/rollup-linux-arm-gnueabihf@4.18.1: + resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.18.0: - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + /@rollup/rollup-linux-arm-musleabihf@4.18.1: + resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.18.0: - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + /@rollup/rollup-linux-arm64-gnu@4.18.1: + resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.18.0: - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + /@rollup/rollup-linux-arm64-musl@4.18.1: + resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + /@rollup/rollup-linux-powerpc64le-gnu@4.18.1: + resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.18.0: - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + /@rollup/rollup-linux-riscv64-gnu@4.18.1: + resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.18.0: - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + /@rollup/rollup-linux-s390x-gnu@4.18.1: + resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.18.0: - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + /@rollup/rollup-linux-x64-gnu@4.18.1: + resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.18.0: - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + /@rollup/rollup-linux-x64-musl@4.18.1: + resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.18.0: - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + /@rollup/rollup-win32-arm64-msvc@4.18.1: + resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.18.0: - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + /@rollup/rollup-win32-ia32-msvc@4.18.1: + resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.18.0: - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + /@rollup/rollup-win32-x64-msvc@4.18.1: + resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] requiresBuild: true @@ -1275,18 +1281,18 @@ packages: resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} dev: false - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + /@scure/bip32@1.4.0: + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 dev: false - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + /@scure/bip39@1.3.0: + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} dependencies: - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 dev: false @@ -1305,23 +1311,19 @@ packages: resolution: {integrity: sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==} dev: false - /@testcontainers/postgresql@10.10.0: - resolution: {integrity: sha512-cgzYnhzsYPVwN370bjJCuyAkkjLhGD6EBoQi4j+xKomMU4e6FWu0SYDolP+tiFGKWaS95SsIY3CPp6bnuxBh/A==} + /@testcontainers/postgresql@10.10.2: + resolution: {integrity: sha512-W8FN3N19JjTpKH1VEHZg/rQMMEJT4PM628uJQnBdNv/aZZ8fPttVHh5OCuRfAQZPl+oh0UdP+U8nG+fXonbGnw==} dependencies: - testcontainers: 10.10.0 + testcontainers: 10.10.2 transitivePeerDependencies: - encoding - supports-color dev: true - /@types/big.js@6.2.2: - resolution: {integrity: sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==} - dev: true - /@types/docker-modem@3.0.6: resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/ssh2': 1.15.0 dev: true @@ -1329,7 +1331,7 @@ packages: resolution: {integrity: sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==} dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/ssh2': 1.15.0 dev: true @@ -1347,8 +1349,8 @@ packages: undici-types: 5.26.5 dev: true - /@types/node@20.14.9: - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + /@types/node@20.14.10: + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} dependencies: undici-types: 5.26.5 dev: true @@ -1360,13 +1362,13 @@ packages: /@types/ssh2-streams@0.1.12: resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/ssh2-streams': 0.1.12 dev: true @@ -1376,8 +1378,8 @@ packages: '@types/node': 18.19.39 dev: true - /@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} + /@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0)(eslint@8.57.0)(typescript@5.5.3): + resolution: {integrity: sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1387,24 +1389,24 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.16.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.2) - typescript: 5.5.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} + /@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3): + resolution: {integrity: sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1413,27 +1415,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.0 debug: 4.3.5 eslint: 8.57.0 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@7.14.1: - resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} + /@typescript-eslint/scope-manager@7.16.0: + resolution: {integrity: sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/visitor-keys': 7.16.0 dev: true - /@typescript-eslint/type-utils@7.14.1(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} + /@typescript-eslint/type-utils@7.16.0(eslint@8.57.0)(typescript@5.5.3): + resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1442,23 +1444,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) debug: 4.3.5 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.2) - typescript: 5.5.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@7.14.1: - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} + /@typescript-eslint/types@7.16.0: + resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==} engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2): - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} + /@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3): + resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1466,40 +1468,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/visitor-keys': 7.16.0 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.2) - typescript: 5.5.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} + /@typescript-eslint/utils@7.16.0(eslint@8.57.0)(typescript@5.5.3): + resolution: {integrity: sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@7.14.1: - resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} + /@typescript-eslint/visitor-keys@7.16.0: + resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/types': 7.16.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1514,9 +1516,9 @@ packages: dependencies: debug: 4.3.5 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magicast: 0.3.4 picocolors: 1.0.1 @@ -1575,8 +1577,8 @@ packages: yargs: 17.7.2 dev: false - /abitype@1.0.4(typescript@5.5.2)(zod@3.23.8): - resolution: {integrity: sha512-UivtYZOGJGE8rsrM/N5vdRkUpqEZVmuTumfTuolm7m/6O09wprd958rx8kUBwVAAAhQDveGAgD0GJdBuR8s6tw==} + /abitype@1.0.5(typescript@5.5.3)(zod@3.23.8): + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -1586,7 +1588,7 @@ packages: zod: optional: true dependencies: - typescript: 5.5.2 + typescript: 5.5.3 zod: 3.23.8 dev: false @@ -1601,23 +1603,23 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: false - /acorn-jsx@5.3.2(acorn@8.12.0): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.12.0 + acorn: 8.12.1 dev: true /acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.12.0 + acorn: 8.12.1 dev: true - /acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1968,10 +1970,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001637 - electron-to-chromium: 1.4.812 + caniuse-lite: 1.0.30001640 + electron-to-chromium: 1.4.818 node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) + update-browserslist-db: 1.1.0(browserslist@4.23.1) dev: true /buffer-crc32@0.2.13: @@ -2037,8 +2039,8 @@ packages: engines: {node: '>=14.16'} dev: true - /caniuse-lite@1.0.30001637: - resolution: {integrity: sha512-1x0qRI1mD1o9e+7mBI7XtzFAP4XszbHaVWsMiGbSPLYekKTJF7K+FNk6AsXH4sUpc+qrsI3pVgf1Jdl/uGkuSQ==} + /caniuse-lite@1.0.30001640: + resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==} dev: true /cardinal@2.1.1: @@ -2389,8 +2391,8 @@ packages: hasBin: true dependencies: '@esbuild-kit/esm-loader': 2.6.5 - '@hono/node-server': 1.11.4 - '@hono/zod-validator': 0.2.2(hono@4.4.8)(zod@3.23.8) + '@hono/node-server': 1.12.0 + '@hono/zod-validator': 0.2.2(hono@4.4.12)(zod@3.23.8) camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 @@ -2399,7 +2401,7 @@ packages: esbuild-register: 3.5.0(esbuild@0.19.12) glob: 8.1.0 hanji: 0.0.5 - hono: 4.4.8 + hono: 4.4.12 json-diff: 0.9.0 minimatch: 7.4.6 semver: 7.6.2 @@ -2498,8 +2500,8 @@ packages: safe-buffer: 5.2.1 dev: false - /electron-to-chromium@1.4.812: - resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==} + /electron-to-chromium@1.4.818: + resolution: {integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==} dev: true /elliptic@6.5.5: @@ -2802,7 +2804,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.14.1)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.16.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2812,8 +2814,8 @@ packages: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.14.0 @@ -2825,7 +2827,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -2846,16 +2848,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 7.16.0(eslint@8.57.0)(typescript@5.5.3) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.14.1)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.16.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -2865,7 +2867,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 7.16.0(eslint@8.57.0)(typescript@5.5.3) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -2874,7 +2876,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.14.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -2911,15 +2913,15 @@ packages: synckit: 0.8.8 dev: true - /eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): - resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + /eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.0): + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: eslint: '>=5.0.0' dependencies: eslint: 8.57.0 dev: true - /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.14.1)(eslint@8.57.0): + /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.16.0)(eslint@8.57.0): resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2929,12 +2931,12 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0)(eslint@8.57.0)(typescript@5.5.3) eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.14.1)(eslint@8.57.0)(typescript@5.5.2)(vitest@1.6.0): + /eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.16.0)(eslint@8.57.0)(typescript@5.5.3)(vitest@1.6.0): resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} engines: {node: ^18.0.0 || >= 20.0.0} peerDependencies: @@ -2947,8 +2949,8 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0)(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) eslint: 8.57.0 vitest: 1.6.0 transitivePeerDependencies: @@ -2980,7 +2982,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -2996,7 +2998,7 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -3035,8 +3037,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 dev: true @@ -3046,8 +3048,8 @@ packages: hasBin: true dev: false - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -3183,8 +3185,8 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.28.0: - resolution: {integrity: sha512-HhW7UHW07YlqH5qpS0af8d2Gl/o98DhJ8ZDQWHRNDnzeOhZvtreWsX8xanjGgXmkYerGbo8ax/n40Dpwqkot8Q==} + /fastify@4.28.1: + resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} dependencies: '@fastify/ajv-compiler': 3.6.0 '@fastify/error': 3.4.1 @@ -3539,8 +3541,8 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: false - /hono@4.4.8: - resolution: {integrity: sha512-eewnSgTzdWgFVn97kPV24h+9UVNUQ+9mj6IRxr7dBseTaTBSHtFo/T/vRNcqJkQFysVoXyecflr3Xe/fdvzEpQ==} + /hono@4.4.12: + resolution: {integrity: sha512-Lx4Vwbws0IqFfXIVYychxUW0A4EE+7dn/jsjVeM34OXSA2Xs45MkDDP14Mzznp7LlDemUNHQG2uv2N5jQld0hA==} engines: {node: '>=16.0.0'} dev: true @@ -3786,8 +3788,8 @@ packages: engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + /istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: '@babel/core': 7.24.7 @@ -3808,8 +3810,8 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + /istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -3965,7 +3967,7 @@ packages: engines: {node: '>=14'} dependencies: mlly: 1.7.1 - pkg-types: 1.1.1 + pkg-types: 1.1.3 dev: true /locate-path@6.0.0: @@ -4169,9 +4171,9 @@ packages: /mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} dependencies: - acorn: 8.12.0 + acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.1 + pkg-types: 1.1.3 ufo: 1.5.3 dev: true @@ -4321,7 +4323,7 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 dev: true /p-locate@5.0.0: @@ -4416,8 +4418,8 @@ packages: thread-stream: 3.1.0 dev: false - /pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + /pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} dependencies: confbox: 0.1.7 mlly: 1.7.1 @@ -4429,8 +4431,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -4525,8 +4527,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + /qs@6.12.2: + resolution: {integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 @@ -4669,29 +4671,29 @@ packages: glob: 7.2.3 dev: true - /rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + /rollup@4.18.1: + resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.18.1 + '@rollup/rollup-android-arm64': 4.18.1 + '@rollup/rollup-darwin-arm64': 4.18.1 + '@rollup/rollup-darwin-x64': 4.18.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 + '@rollup/rollup-linux-arm-musleabihf': 4.18.1 + '@rollup/rollup-linux-arm64-gnu': 4.18.1 + '@rollup/rollup-linux-arm64-musl': 4.18.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 + '@rollup/rollup-linux-riscv64-gnu': 4.18.1 + '@rollup/rollup-linux-s390x-gnu': 4.18.1 + '@rollup/rollup-linux-x64-gnu': 4.18.1 + '@rollup/rollup-linux-x64-musl': 4.18.1 + '@rollup/rollup-win32-arm64-msvc': 4.18.1 + '@rollup/rollup-win32-ia32-msvc': 4.18.1 + '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 dev: true @@ -4883,10 +4885,10 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /starknet@6.10.0: - resolution: {integrity: sha512-Zlo39V37dytBcqHlWpyLkEH4lXGRMaH7ST4yDGSGxkgxlJ11xW7P7abpWnB87Qn9SdgEzUEDLyM3TeBVTsdtYA==} + /starknet@6.11.0: + resolution: {integrity: sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg==} dependencies: - '@noble/curves': 1.4.0 + '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 '@scure/starknet': 1.0.0 @@ -4912,7 +4914,7 @@ packages: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.1.0 + text-decoder: 1.1.1 optionalDependencies: bare-events: 2.4.2 dev: true @@ -5077,8 +5079,8 @@ packages: minimatch: 3.1.2 dev: true - /testcontainers@10.10.0: - resolution: {integrity: sha512-XlAdr6XzxM9ywTc5D6xA97Ug8dCotDnrOgOqmy3vYnAwUYrzhzAwrp791g97QAMvDOYp2pxkJl/P4WxuUbGShw==} + /testcontainers@10.10.2: + resolution: {integrity: sha512-Wbzi7enfpKFtmb7kffs6EBksPX7J6jHFWIsLYe2VOSrnscX2hRs84TNvl9Hfro8WTCtAfuY/935kunCcdlzi8A==} dependencies: '@balena/dockerignore': 1.0.2 '@types/dockerode': 3.3.29 @@ -5100,8 +5102,8 @@ packages: - supports-color dev: true - /text-decoder@1.1.0: - resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + /text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} dependencies: b4a: 1.6.6 dev: true @@ -5173,21 +5175,21 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /ts-api-utils@1.3.0(typescript@5.5.2): + /ts-api-utils@1.3.0(typescript@5.5.3): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.5.2 + typescript: 5.5.3 dev: true /ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} dev: false - /tsconfck@3.1.0(typescript@5.5.2): - resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==} + /tsconfck@3.1.1(typescript@5.5.3): + resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -5196,7 +5198,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.5.2 + typescript: 5.5.3 dev: true /tsconfig-paths@3.15.0: @@ -5212,8 +5214,8 @@ packages: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} dev: true - /tsx@4.15.7: - resolution: {integrity: sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==} + /tsx@4.16.2: + resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: @@ -5227,15 +5229,15 @@ packages: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true - /twilio@5.2.0: - resolution: {integrity: sha512-v58OiasUj9ckZpdkLAJWZ6KJIjM7GM57onM93xxqq7YVJRgLG0jS0nZY3X+Lm6dF2f653BUkTn6R6kmky7pLYw==} + /twilio@5.2.2: + resolution: {integrity: sha512-t2Nd8CvqAc0YxbJghKYQl1Vxc7e6SrWk4U28wwkarUohGcsUMLsGpYeGXKw1Va0KB9TGVZYCs8dcP4TdLJUN9Q==} engines: {node: '>=14.0'} dependencies: axios: 1.7.2 dayjs: 1.11.11 https-proxy-agent: 5.0.1 jsonwebtoken: 9.0.2 - qs: 6.12.1 + qs: 6.12.2 scmp: 2.1.0 xmlbuilder: 13.0.2 transitivePeerDependencies: @@ -5308,8 +5310,8 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true @@ -5340,8 +5342,8 @@ packages: engines: {node: '>= 10.0.0'} dev: false - /update-browserslist-db@1.0.16(browserslist@4.23.1): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + /update-browserslist-db@1.1.0(browserslist@4.23.1): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5371,8 +5373,8 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /viem@2.16.2(typescript@5.5.2)(zod@3.23.8): - resolution: {integrity: sha512-qor3v1cJFR3jcPtcJxPbKfKURAH2agNf2IWZIaSReV6teNLERiu4Sr7kbqpkIeTAEpiDCVQwg336M+mub1m+pg==} + /viem@2.17.3(typescript@5.5.3)(zod@3.23.8): + resolution: {integrity: sha512-FY/1uBQWfko4Esy8mU1RamvL64TLy91LZwFyQJ20E6AI3vTTEOctWfSn0pkMKa3okq4Gxs5dJE7q1hmWOQ7xcw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -5380,13 +5382,13 @@ packages: optional: true dependencies: '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.4(typescript@5.5.2)(zod@3.23.8) + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + abitype: 1.0.5(typescript@5.5.3)(zod@3.23.8) isows: 1.0.4(ws@8.17.1) - typescript: 5.5.2 + typescript: 5.5.3 ws: 8.17.1 transitivePeerDependencies: - bufferutil @@ -5403,7 +5405,7 @@ packages: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.1 + vite: 5.3.3 transitivePeerDependencies: - '@types/node' - less @@ -5415,7 +5417,7 @@ packages: - terser dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.5.2): + /vite-tsconfig-paths@4.3.2(typescript@5.5.3): resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' @@ -5425,14 +5427,14 @@ packages: dependencies: debug: 4.3.5 globrex: 0.1.2 - tsconfck: 3.1.0(typescript@5.5.2) + tsconfck: 3.1.1(typescript@5.5.3) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.3.1: - resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + /vite@5.3.3: + resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5460,8 +5462,8 @@ packages: optional: true dependencies: esbuild: 0.21.5 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.4.39 + rollup: 4.18.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -5508,9 +5510,9 @@ packages: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.1 + vite: 5.3.3 vite-node: 1.6.0 - why-is-node-running: 2.2.2 + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss @@ -5563,8 +5565,8 @@ packages: isexe: 2.0.0 dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: @@ -5650,8 +5652,8 @@ packages: engines: {node: '>=10'} dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} dev: true diff --git a/backend/src/constants/funkit.ts b/backend/src/constants/funkit.ts index 7c1d08ec..23b2a533 100644 --- a/backend/src/constants/funkit.ts +++ b/backend/src/constants/funkit.ts @@ -1,31 +1,34 @@ -export const FUNKIT_API_BASE_URL = 'https://api.fun.xyz/v1' export const FUNKIT_STARKNET_CHAIN_ID = '23448594291968334' -export const POLYGON_CHAIN_ID = '137' -export const POLYGON_NETWORK_NAME = 'polygon' export const SOURCE_OF_FUND_KEY = 'card|stripe' export const FUNKIT_STRIPE_SOURCE_CURRENCY = 'usd' -const STARKNET_USDC_ADDRESS = '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8' -const STARKNET_USDC_DECIMALS = 6 -const POLYGON_MATIC_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' -const POLYGON_MATIC_DECIMALS = 18 -const POLYGON_USDC_ADDRESS = '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359' -const POLYGON_USDC_DECIMALS = 6 - export const TOKEN_INFO = { STARKNET_USDC: { - address: STARKNET_USDC_ADDRESS, - decimals: STARKNET_USDC_DECIMALS, + address: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', + decimals: 6, symbol: 'usdc', + network: 'starknet', + networkId: FUNKIT_STARKNET_CHAIN_ID, + }, + ETHEREUM_ETH: { + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + decimals: 18, + symbol: 'eth', + network: 'ethereum', + networkId: '1', }, POLYGON_MATIC: { - address: POLYGON_MATIC_ADDRESS, - decimals: POLYGON_MATIC_DECIMALS, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + decimals: 18, symbol: 'matic', + network: 'polygon', + networkId: '137', }, POLYGON_USDC: { - address: POLYGON_USDC_ADDRESS, - decimals: POLYGON_USDC_DECIMALS, + address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', + decimals: 6, symbol: 'usdc', + network: 'polygon', + networkId: '137', }, } diff --git a/backend/src/routes/createFunkitStripeCheckout.ts b/backend/src/routes/createFunkitStripeCheckout.ts index c7ee2a22..a56297d3 100644 --- a/backend/src/routes/createFunkitStripeCheckout.ts +++ b/backend/src/routes/createFunkitStripeCheckout.ts @@ -1,28 +1,20 @@ +import { createStripeBuySession, initializeCheckout } from '@funkit/api-base' import type { FastifyInstance } from 'fastify' -import { - FUNKIT_API_BASE_URL, - FUNKIT_STRIPE_SOURCE_CURRENCY, - POLYGON_NETWORK_NAME, - SOURCE_OF_FUND_KEY, -} from '@/constants/funkit' -import { - generateClientMetadata, - generateRandomCheckoutSalt, - pickSourceAssetForCheckout, - stringifyWithBigIntSanitization, -} from '@/utils/funkit' +import { FUNKIT_STRIPE_SOURCE_CURRENCY, SOURCE_OF_FUND_KEY } from '@/constants/funkit' +import { generateClientMetadata, getBooleanFromString, pickSourceAssetForCheckout } from '@/utils/funkit' interface InitCheckoutBody { quoteId: string paymentTokenAmount: number estSubtotalUsd: number isNy: boolean + isEu: boolean } export function createFunkitStripeCheckout(fastify: FastifyInstance, funkitApiKey: string): void { fastify.post<{ Body: InitCheckoutBody }>('/create_funkit_stripe_checkout', async (request, reply) => { - const { quoteId, paymentTokenAmount, estSubtotalUsd, isNy } = request.body as InitCheckoutBody + const { quoteId, paymentTokenAmount, estSubtotalUsd, isEu, isNy } = request.body as InitCheckoutBody if (!quoteId) { return reply.status(400).send({ message: 'quoteId is required.' }) } @@ -39,50 +31,33 @@ export function createFunkitStripeCheckout(fastify: FastifyInstance, funkitApiKe return reply.status(400).send({ message: 'isNy is a required boolean.' }) } + if (isEu == null) { + return reply.status(400).send({ message: 'isEu is a required boolean.' }) + } + try { // 1 - Initialize the checkout and get a unique depositAddress - const pickedSourceAsset = pickSourceAssetForCheckout(isNy) - const body = { + const pickedSourceAsset = pickSourceAssetForCheckout(getBooleanFromString(isEu), getBooleanFromString(isNy)) + const depositAddress = await initializeCheckout({ + userOp: null, quoteId, sourceOfFund: SOURCE_OF_FUND_KEY, - salt: generateRandomCheckoutSalt(), clientMetadata: generateClientMetadata({ pickedSourceAsset, estDollarValue: estSubtotalUsd }), - } - const fetchRes = await fetch(`${FUNKIT_API_BASE_URL}/checkout`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Api-Key': funkitApiKey, - }, - body: stringifyWithBigIntSanitization(body), + apiKey: funkitApiKey, }) - const res = (await fetchRes.json()) as any - const depositAddress = res?.depositAddr if (!depositAddress) { return reply.status(500).send({ message: 'Failed to start a funkit checkout.' }) } - // 2 - Generate stripe session - const stripeSessionBody = { + const stripeSession = await createStripeBuySession({ + apiKey: funkitApiKey, sourceCurrency: FUNKIT_STRIPE_SOURCE_CURRENCY, destinationAmount: paymentTokenAmount, - destinationCurrencies: [pickedSourceAsset.symbol], destinationCurrency: pickedSourceAsset.symbol, - destinationNetworks: [POLYGON_NETWORK_NAME], - destinationNetwork: POLYGON_NETWORK_NAME, - walletAddresses: { - [POLYGON_NETWORK_NAME]: depositAddress, - }, - } - const generateStripeRes = await fetch(`${FUNKIT_API_BASE_URL}/on-ramp/stripe-checkout`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Api-Key': funkitApiKey, - }, - body: stringifyWithBigIntSanitization(stripeSessionBody), + destinationNetwork: pickedSourceAsset.network, + walletAddress: depositAddress, + isSandbox: false, }) - const stripeSession = (await generateStripeRes.json()) as any if (!stripeSession || !stripeSession.id || !stripeSession.redirect_url) { return reply.status(500).send({ message: 'Failed to start a stripe checkout session.' }) } @@ -91,7 +66,7 @@ export function createFunkitStripeCheckout(fastify: FastifyInstance, funkitApiKe stripeRedirectUrl: stripeSession.redirect_url, funkitDepositAddress: depositAddress, }) - } catch (error) { + } catch (error: any) { console.error('Failed to start a checkout:', error) return reply.status(500).send({ message: 'Failed to start a checkout.' }) } diff --git a/backend/src/routes/getFunkitStripeCheckoutQuote.ts b/backend/src/routes/getFunkitStripeCheckoutQuote.ts index 544a8844..4b5ee568 100644 --- a/backend/src/routes/getFunkitStripeCheckoutQuote.ts +++ b/backend/src/routes/getFunkitStripeCheckoutQuote.ts @@ -1,29 +1,16 @@ -import Big from 'big.js' +import { getCheckoutQuote, getStripeBuyQuote } from '@funkit/api-base' import type { FastifyInstance } from 'fastify' -import { Address } from 'viem' +import { getChecksumAddress } from 'starknet' -import { - FUNKIT_API_BASE_URL, - FUNKIT_STARKNET_CHAIN_ID, - FUNKIT_STRIPE_SOURCE_CURRENCY, - POLYGON_CHAIN_ID, - POLYGON_NETWORK_NAME, - TOKEN_INFO, -} from '@/constants/funkit' -import { pickSourceAssetForCheckout, roundUpToFiveDecimalPlaces } from '@/utils/funkit' +import { FUNKIT_STARKNET_CHAIN_ID, FUNKIT_STRIPE_SOURCE_CURRENCY, TOKEN_INFO } from '@/constants/funkit' +import { getBooleanFromString, pickSourceAssetForCheckout, roundUpToFiveDecimalPlaces } from '@/utils/funkit' import { addressRegex } from '.' - -interface CheckoutQuote { - quoteId: string - estTotalFromAmountBaseUnit: string - estSubtotalFromAmountBaseUnit: string - estFeesFromAmountBaseUnit: string - fromTokenAddress: Address - estFeesUsd: number - estSubtotalUsd: number - estTotalUsd: number - estCheckoutTimeMs: number +interface GetQuoteQuery { + address: string + tokenAmount: number + isNy: boolean + isEu: boolean } export function getFunkitStripeCheckoutQuote(fastify: FastifyInstance, funkitApiKey: string) { @@ -31,7 +18,7 @@ export function getFunkitStripeCheckoutQuote(fastify: FastifyInstance, funkitApi '/get_funkit_stripe_checkout_quote', async (request, reply) => { - const { address, tokenAmount, isNy } = request.query as { address: string; tokenAmount: number; isNy: boolean } + const { address, tokenAmount, isNy, isEu } = request.query as GetQuoteQuery if (!address) { return reply.status(400).send({ message: 'Address is required.' }) @@ -49,67 +36,56 @@ export function getFunkitStripeCheckoutQuote(fastify: FastifyInstance, funkitApi return reply.status(400).send({ message: 'isNy is a required boolean.' }) } + if (isEu == null) { + return reply.status(400).send({ message: 'isEu is a required boolean.' }) + } + try { // 1 - Generate the funkit checkout quote - const toMultiplier = 10 ** TOKEN_INFO.STARKNET_USDC.decimals - const toAmountBaseUnitBI = BigInt(Math.floor(tokenAmount * toMultiplier)) - const pickedSourceAsset = pickSourceAssetForCheckout(isNy) - const queryParams = { - fromChainId: POLYGON_CHAIN_ID, - fromTokenAddress: pickedSourceAsset.address, + const pickedSourceAsset = pickSourceAssetForCheckout(getBooleanFromString(isEu), getBooleanFromString(isNy)) + const normalizedRecipientAddress = getChecksumAddress(address) + const baseQuote = await getCheckoutQuote({ + fromChainId: pickedSourceAsset.networkId, + fromTokenAddress: pickedSourceAsset.address as `0x${string}`, + fromTokenDecimals: pickedSourceAsset.decimals, toChainId: FUNKIT_STARKNET_CHAIN_ID, - toTokenAddress: TOKEN_INFO.STARKNET_USDC.address, - toAmountBaseUnit: toAmountBaseUnitBI.toString(), - recipientAddr: address, - // 1 hour from now - checkoutExpirationTimestampSeconds: Math.round((Date.now() + 3600000) / 1000).toString(), - } - const searchParams = new URLSearchParams(queryParams) - const fetchRes = await fetch(`${FUNKIT_API_BASE_URL}/checkout/quote?${searchParams}`, { - headers: { - 'X-Api-Key': funkitApiKey, - }, + toTokenAddress: TOKEN_INFO.STARKNET_USDC.address as `0x${string}`, + toTokenDecimals: TOKEN_INFO.STARKNET_USDC.decimals, + toTokenAmount: Number(tokenAmount), + expirationTimestampMs: 1_800_000, // 30 minutes + apiKey: funkitApiKey, + sponsorInitialTransferGasLimit: '0', + recipientAddr: normalizedRecipientAddress as `0x${string}`, + userId: normalizedRecipientAddress, + needsRefuel: false, }) - const quoteRes = (await fetchRes.json()) as CheckoutQuote - if (!quoteRes || !quoteRes.quoteId) { + if (!baseQuote || !baseQuote.quoteId) { return reply.status(500).send({ message: 'Failed to get a funkit quote.' }) } - const fromMultiplier = 10 ** pickedSourceAsset.decimals - const estTotalFromAmount = roundUpToFiveDecimalPlaces( - new Big(quoteRes.estTotalFromAmountBaseUnit).div(fromMultiplier).toString(), - ).toString() - + const estTotalFromAmount = roundUpToFiveDecimalPlaces(baseQuote.estTotalFromAmount) // 2 - Get the stripe quote based on the - const stripeQuoteParams = { + const stripeFullQuote = await getStripeBuyQuote({ sourceCurrency: FUNKIT_STRIPE_SOURCE_CURRENCY, - destinationCurrencies: pickedSourceAsset.symbol, - destinationNetworks: POLYGON_NETWORK_NAME, + destinationCurrency: pickedSourceAsset.symbol, + destinationNetwork: pickedSourceAsset.network, destinationAmount: estTotalFromAmount, - } - const stripeQuoteSearchParams = new URLSearchParams(stripeQuoteParams) - const stripeQuoteRes = await fetch( - `${FUNKIT_API_BASE_URL}/on-ramp/stripe-buy-quote?${stripeQuoteSearchParams}`, - { - headers: { - 'X-Api-Key': funkitApiKey, - }, - }, - ) - const stripeQuote = (await stripeQuoteRes.json()) as any - const stripePolygonQuote = stripeQuote?.destination_network_quotes?.polygon?.[0] - if (!stripePolygonQuote) { + apiKey: funkitApiKey, + isSandbox: false, + }) + const stripeQuote = stripeFullQuote?.destination_network_quotes?.[pickedSourceAsset.network]?.[0] + if (!stripeQuote) { return reply.status(500).send({ message: 'Failed to get stripe quote.' }) } const finalQuote = { - quoteId: quoteRes.quoteId, - estSubtotalUsd: quoteRes.estSubtotalUsd, - paymentTokenChain: POLYGON_CHAIN_ID, + quoteId: baseQuote.quoteId, + estSubtotalUsd: baseQuote.estSubtotalUsd, + paymentTokenChain: pickedSourceAsset.network, paymentTokenSymbol: pickedSourceAsset.symbol, paymentTokenAmount: estTotalFromAmount, - networkFees: (Number(stripePolygonQuote.fees.network_fee_monetary) + Number(quoteRes.estFeesUsd)).toFixed(2), - cardFees: Number(stripePolygonQuote.fees.transaction_fee_monetary).toFixed(2), - totalUsd: Number(stripePolygonQuote.source_total_amount).toFixed(2), + networkFees: (Number(stripeQuote.fees.network_fee_monetary) + Number(baseQuote.estFeesUsd)).toFixed(2), + cardFees: Number(stripeQuote.fees.transaction_fee_monetary).toFixed(2), + totalUsd: Number(stripeQuote.source_total_amount).toFixed(2), } return reply.send(finalQuote) } catch (error) { diff --git a/backend/src/routes/getFunkitStripeCheckoutStatus.ts b/backend/src/routes/getFunkitStripeCheckoutStatus.ts index dc1a51f0..971fc34a 100644 --- a/backend/src/routes/getFunkitStripeCheckoutStatus.ts +++ b/backend/src/routes/getFunkitStripeCheckoutStatus.ts @@ -1,7 +1,6 @@ +import { getCheckoutByDepositAddress } from '@funkit/api-base' import type { FastifyInstance } from 'fastify' -import { FUNKIT_API_BASE_URL } from '@/constants/funkit' - export function getFunkitStripeCheckoutStatus(fastify: FastifyInstance, funkitApiKey: string) { fastify.get( '/get_funkit_stripe_checkout_status', @@ -15,20 +14,20 @@ export function getFunkitStripeCheckoutStatus(fastify: FastifyInstance, funkitAp return reply.status(400).send({ message: 'funkitDepositAddress is required.' }) } try { - const checkoutRes = await fetch(`${FUNKIT_API_BASE_URL}/checkout/${funkitDepositAddress}`, { - headers: { - 'X-Api-Key': funkitApiKey, - }, + const checkoutItem = await getCheckoutByDepositAddress({ + depositAddress: funkitDepositAddress as `0x${string}`, + apiKey: funkitApiKey, }) - const checkoutItem = (await checkoutRes.json()) as any - if (!checkoutItem || checkoutItem?.errorMsg) { + if (!checkoutItem || !checkoutItem?.depositAddr) { return reply.status(500).send({ message: 'Failed to get a funkit checkout.' }) } return reply.send({ state: checkoutItem.state, }) - } catch (error) { - console.error(error) + } catch (error: any) { + if (error?.message?.includes('InvalidParameterError')) { + return reply.status(500).send({ message: 'Failed to get a funkit checkout.' }) + } return reply.status(500).send({ message: 'Internal server error' }) } }, diff --git a/backend/src/utils/funkit.ts b/backend/src/utils/funkit.ts index b0c19d99..f1d6dd58 100644 --- a/backend/src/utils/funkit.ts +++ b/backend/src/utils/funkit.ts @@ -1,25 +1,4 @@ -import { toHex } from 'viem' - -import { POLYGON_CHAIN_ID, TOKEN_INFO } from '@/constants/funkit' - -function randomBytes(length: number) { - const bytes = new Uint8Array(length) - for (let i = 0; i < length; i++) { - bytes[i] = Math.floor(Math.random() * 256) - } - return toHex(bytes) -} - -export function generateRandomCheckoutSalt() { - return BigInt(randomBytes(32)) -} - -export function stringifyWithBigIntSanitization(object: any) { - return JSON.stringify( - object, - (_, value) => (typeof value === 'bigint' ? toHex(value) : value), // return everything else unchanged - ) -} +import { TOKEN_INFO } from '@/constants/funkit' export function roundUpToFiveDecimalPlaces(inputNumber: string) { // Using toFixed to round up to 5 decimal places @@ -30,8 +9,12 @@ export function roundUpToFiveDecimalPlaces(inputNumber: string) { return roundedNumber } -export function pickSourceAssetForCheckout(isNy: boolean) { - return isNy ? TOKEN_INFO.POLYGON_MATIC : TOKEN_INFO.POLYGON_USDC +export function pickSourceAssetForCheckout(isEu: boolean, isNy: boolean) { + return isEu ? TOKEN_INFO.ETHEREUM_ETH : isNy ? TOKEN_INFO.POLYGON_MATIC : TOKEN_INFO.POLYGON_USDC +} + +export function getBooleanFromString(value: string | boolean) { + return typeof value === 'boolean' ? value : value.toLowerCase() === 'true' } // To be compliant with existing funkit SDK -- can be ignored @@ -43,7 +26,7 @@ export function generateClientMetadata({ estDollarValue: number }) { return { - id: generateRandomCheckoutSalt().toString(), + id: Math.random(), startTimestampMs: Date.now(), draftDollarValue: estDollarValue.toFixed(5), finalDollarValue: estDollarValue.toFixed(5), @@ -53,7 +36,7 @@ export function generateClientMetadata({ isFastForwarded: false, selectedSourceAssetInfo: { address: pickedSourceAsset.address, - chainId: POLYGON_CHAIN_ID, + chainId: pickedSourceAsset.networkId, symbol: pickedSourceAsset.symbol.toUpperCase(), }, selectedPaymentMethodInfo: { diff --git a/backend/test/createFunkitStripeCheckout.test.ts b/backend/test/createFunkitStripeCheckout.test.ts index b1fd4f14..58774b8e 100644 --- a/backend/test/createFunkitStripeCheckout.test.ts +++ b/backend/test/createFunkitStripeCheckout.test.ts @@ -31,7 +31,7 @@ describe('POST /create_funkit_stripe_checkout route', () => { // A quote has to be generated first before creating a checkout const quoteResponse = await app.inject({ method: 'GET', - url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false`, + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false&isEu=true`, }) const quoteObject = quoteResponse.json() const createResponse = await app.inject({ @@ -42,6 +42,7 @@ describe('POST /create_funkit_stripe_checkout route', () => { paymentTokenAmount: quoteObject.paymentTokenAmount, estSubtotalUsd: quoteObject.estSubtotalUsd, isNy: false, + isEu: true, }, }) expect(createResponse.statusCode).toBe(200) @@ -60,10 +61,11 @@ describe('POST /create_funkit_stripe_checkout route', () => { paymentTokenAmount: 10, estSubtotalUsd: 10, isNy: false, + isEu: true, }, }) expect(createResponse.statusCode).toBe(500) - expect(createResponse.json()).toHaveProperty('message', 'Failed to start a funkit checkout.') + expect(createResponse.json()).toHaveProperty('message', 'Failed to start a checkout.') }) test('should throw 400 for missing quoteId', async () => { @@ -105,4 +107,14 @@ describe('POST /create_funkit_stripe_checkout route', () => { expect(createResponse.statusCode).toBe(400) expect(createResponse.json()).toHaveProperty('message', 'isNy is a required boolean.') }) + + test('should throw 400 for missing isEu', async () => { + const createResponse = await app.inject({ + method: 'POST', + url: `/create_funkit_stripe_checkout`, + body: { quoteId: 'dummyQuoteId', paymentTokenAmount: 10, estSubtotalUsd: 10, isNy: true }, + }) + expect(createResponse.statusCode).toBe(400) + expect(createResponse.json()).toHaveProperty('message', 'isEu is a required boolean.') + }) }) diff --git a/backend/test/getFunkitStripeCheckoutQuote.test.ts b/backend/test/getFunkitStripeCheckoutQuote.test.ts index 4f80aefb..6646372e 100644 --- a/backend/test/getFunkitStripeCheckoutQuote.test.ts +++ b/backend/test/getFunkitStripeCheckoutQuote.test.ts @@ -30,7 +30,7 @@ describe('GET /get_funkit_stripe_checkout_quote route', () => { test('should return success with valid parameters', async () => { const response = await app.inject({ method: 'GET', - url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false`, + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false&isEu=true`, }) expect(response.statusCode).toBe(200) const resJson = response.json() @@ -44,6 +44,39 @@ describe('GET /get_funkit_stripe_checkout_quote route', () => { expect(resJson).toHaveProperty('totalUsd') }) + test('should return quote with eth (ethereum) if in EU', async () => { + const response = await app.inject({ + method: 'GET', + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false&isEu=true`, + }) + expect(response.statusCode).toBe(200) + const resJson = response.json() + expect(resJson.paymentTokenChain).toBe('ethereum') + expect(resJson.paymentTokenSymbol).toBe('eth') + }) + + test('should return quote with matic (polygon) if in NY', async () => { + const response = await app.inject({ + method: 'GET', + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=true&isEu=false`, + }) + expect(response.statusCode).toBe(200) + const resJson = response.json() + expect(resJson.paymentTokenChain).toBe('polygon') + expect(resJson.paymentTokenSymbol).toBe('matic') + }) + + test('should return quote with usdc (polygon) if not in NY and not in EU', async () => { + const response = await app.inject({ + method: 'GET', + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=10&isNy=false&isEu=false`, + }) + expect(response.statusCode).toBe(200) + const resJson = response.json() + expect(resJson.paymentTokenChain).toBe('polygon') + expect(resJson.paymentTokenSymbol).toBe('usdc') + }) + test('should throw 400 for empty query parameters', async () => { const response = await app.inject({ method: 'GET', @@ -79,4 +112,13 @@ describe('GET /get_funkit_stripe_checkout_quote route', () => { expect(response.statusCode).toBe(400) expect(response.json()).toHaveProperty('message', 'isNy is a required boolean.') }) + + test('should throw 400 for missing isEu input', async () => { + const response = await app.inject({ + method: 'GET', + url: `/get_funkit_stripe_checkout_quote?address=0x00191f4a5635b5A51b33383190ccF2080ef53454d6A917bB3EECCD2028c82caf&tokenAmount=2&isNy=false`, + }) + expect(response.statusCode).toBe(400) + expect(response.json()).toHaveProperty('message', 'isEu is a required boolean.') + }) })