diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 000000000..e8ca4a068
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,62 @@
+name: Deploy primodium interface
+
+on:
+ workflow_dispatch:
+ # pull_request:
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4.2.0
+
+ - uses: pnpm/action-setup@v4
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+
+ - name: Build code
+ run: |
+ cat > .env <<-EOF
+ ${{vars.PRIMODIUM_ENV_FILE}}
+ EOF
+ pnpm install
+ pnpm build:client-core
+
+ - name: Copy files to server
+ uses: appleboy/scp-action@v0.1.7
+ with:
+ host: ${{ secrets.SERVER_HOST }}
+ username: ${{ secrets.SERVER_USERNAME }}
+ key: ${{ secrets.SERVER_KEY }}
+ port: ${{ secrets.SERVER_PORT }}
+ source: "packages/client/dist"
+ debug: true
+ target: /home/deployer/primodium-interface
+ strip_components: 3 # Remove the first 3 levels of directories from the source path to copy only the files inside dist
+ rm: true
+
+ - name: Deploy primodium interface to server
+ uses: appleboy/ssh-action@v1.1.0
+ with:
+ host: ${{ secrets.SERVER_HOST }}
+ username: ${{ secrets.SERVER_USERNAME }}
+ key: ${{ secrets.SERVER_KEY }}
+ port: ${{ secrets.SERVER_PORT }}
+ debug: true
+ script_stop: true
+ script: |
+ chmod -R o+rX /home/deployer/primodium-interface
+ mv /home/deployer/primodium-interface /tmp
+ sudo -u primodium_interface bash -c '
+ rm -rf /var/www/primodium-interface/*
+ cp -r /tmp/primodium-interface/* /var/www/primodium-interface
+ '
+ rm -rf /tmp/primodium-interface
+
+
\ No newline at end of file
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 9756e97d6..49b9cdcea 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -23,6 +23,9 @@ jobs:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: "v0.3.0"
+
- name: Build client bundle
env:
diff --git a/README.md b/README.md
index dbca1952f..5b75ee880 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,8 @@ This monorepo contains the entire stack for running Primodium, including the Rea
### Installation
+[](https://github.com/HappyChainDevs/primodium/actions/workflows/test.yml)
+
#### Prerequisites
There are a few CLI tools to install to be compatible with the entire monorepo.
diff --git a/packages/client/package.json b/packages/client/package.json
index 9e6c42afd..ea50791b7 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -15,7 +15,7 @@
"lint": "eslint ./src --ext .js,.ts,.tsx",
"lint:fix": "eslint ./src --ext .js,.ts,.tsx --fix",
"preview": "vite preview",
- "test": "vitest"
+ "test": "vitest --environment jsdom"
},
"dependencies": {
"@amplitude/analytics-browser": "^2.1.3",
@@ -38,6 +38,7 @@
"comlink": "^4.4.1",
"contracts": "workspace:*",
"framer-motion": "^10.12.18",
+ "jsdom": "^24.1.0",
"lodash": "^4.17.21",
"phaser": "^3.80.1",
"react": "^18.2.0",
@@ -56,6 +57,7 @@
"devDependencies": {
"@ianvs/prettier-plugin-sort-imports": "^4.3.0",
"@types/lodash": "^4.14.195",
+ "@types/node": "^22.15.17",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"@types/react-virtualized-auto-sizer": "^1.0.3",
diff --git a/packages/client/src/components/transfer/Authorize.tsx b/packages/client/src/components/transfer/Authorize.tsx
index 1707b943d..6973b6363 100644
--- a/packages/client/src/components/transfer/Authorize.tsx
+++ b/packages/client/src/components/transfer/Authorize.tsx
@@ -1,58 +1,36 @@
-import { useEffect, useState } from "react";
-import { FaClipboard, FaExclamationCircle, FaEye, FaEyeSlash, FaInfoCircle, FaTimes, FaUnlink } from "react-icons/fa";
-import { Address, Hex } from "viem";
-import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { requestSessionKey } from "@happy.tech/core";
+import { useState } from "react";
+import { FaInfoCircle, FaTimes } from "react-icons/fa";
-import { STORAGE_PREFIX } from "@primodiumxyz/core";
import { useAccountClient } from "@primodiumxyz/core/react";
import { defaultEntity } from "@primodiumxyz/reactive-tables";
import { Button } from "@/components/core/Button";
import { SecondaryCard } from "@/components/core/Card";
import { TransactionQueueMask } from "@/components/shared/TransactionQueueMask";
-import { useContractCalls } from "@/hooks/useContractCalls";
-import { copyToClipboard } from "@/util/clipboard";
-import { findEntriesWithPrefix } from "@/util/localStorage";
+import { HAPPY_STORAGE_PREFIX, isHappySessionKeyRegistered } from "@/util/localStorage";
-const sessionWalletTooltip =
- "Bypass annoying confirmation popups by authorizing a session account. This allows you to securely perform certain actions without external confirmation.";
+const sessionWalletTooltip = (
+ <>
+ Bypass confirmation popups by authorizing a session key. Powered by{" "}
+ Happy Wallet , this lets you securely perform actions without repeated
+ approvals.
+ >
+);
export function Authorize() {
- const { sessionAccount } = useAccountClient();
- const { grantAccessWithSignature, revokeAccess } = useContractCalls();
- const [showDetails, setShowDetails] = useState(false);
+ const {
+ playerAccount: { address: playerAddress, worldContract },
+ } = useAccountClient();
const [showHelp, setShowHelp] = useState(!localStorage.getItem("hideHelp"));
- useEffect(() => {
- setShowDetails(false);
- }, [sessionAccount]);
+ const weAreHappySponsored = isHappySessionKeyRegistered(playerAddress);
- // Function to handle private key validation and connection
- const sessionAddress = sessionAccount?.address;
+ const handleHappySessionKeyRegister = async () => {
+ if (!isHappySessionKeyRegistered(playerAddress)) {
+ await requestSessionKey(worldContract.address);
- const submitPrivateKey = async (privateKey: Hex) => {
- // Validate the private key format here
- // This is a basic example, adjust the validation according to your requirements
- const isValid = /^0x[a-fA-F0-9]{64}$/.test(privateKey);
- if (!isValid) return;
- const account = privateKeyToAccount(privateKey as Hex);
-
- if (sessionAddress && sessionAddress === account.address) return;
- else await grantAccessWithSignature(privateKey, { id: defaultEntity });
- };
-
- const handleRandomPress = () => {
- const storedKeys = findEntriesWithPrefix();
- const privateKey = storedKeys.length > 0 ? storedKeys[0].privateKey : generatePrivateKey();
-
- const account = privateKeyToAccount(privateKey as Hex);
- localStorage.setItem(STORAGE_PREFIX + account.address, privateKey);
-
- return privateKey;
- };
-
- const removeSessionKey = async (publicKey: Address) => {
- await revokeAccess(publicKey);
- localStorage.removeItem(STORAGE_PREFIX + publicKey);
+ localStorage.setItem(HAPPY_STORAGE_PREFIX + playerAddress, "true");
+ } else return;
};
const hideHelp = () => {
@@ -73,75 +51,17 @@ export function Authorize() {
)}
- {sessionAddress ? (
+ {weAreHappySponsored ? (
-
AUTHORIZING
-
- {
- setShowDetails(false);
- revokeAccess(sessionAddress);
- removeSessionKey(sessionAddress);
- }}
- tooltip="stop authorizing"
- tooltipDirection="top"
- className="btn-sm btn-primary"
- >
-
-
- setShowDetails((prev) => !prev)}
- tooltipDirection="top"
- className="btn-sm btn-primary"
- >
- {showDetails ? : }
-
-
+
+ 🤠SESSION KEY REGISTERED ðŸ¤
+
- {showDetails && (
-
-
-
-
- Session Address:
- copyToClipboard(sessionAddress, "address")}
- tooltipDirection="top"
- >
-
-
- copyToClipboard(sessionAccount?.privateKey, "private key")}
- tooltipDirection="top"
- >
-
-
-
-
{sessionAddress}
-
-
-
- )}
) : (
- {
- const key = handleRandomPress();
- submitPrivateKey(key);
- }}
- >
- CLICK TO AUTHORIZE SESSION ACCOUNT
+
+ CLICK TO AUTHORIZE SESSION KEY
)}
diff --git a/packages/client/src/screens/Enter.tsx b/packages/client/src/screens/Enter.tsx
index 59db0889d..0ef3ed79b 100644
--- a/packages/client/src/screens/Enter.tsx
+++ b/packages/client/src/screens/Enter.tsx
@@ -1,32 +1,32 @@
+import { requestSessionKey } from "@happy.tech/core";
import { useEffect, useState } from "react";
import { FaExclamationTriangle, FaInfoCircle } from "react-icons/fa";
import { useLocation, useNavigate } from "react-router-dom";
import { toast } from "react-toastify";
-import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
-import { STORAGE_PREFIX } from "@primodiumxyz/core";
import { useAccountClient, useCore } from "@primodiumxyz/core/react";
import { defaultEntity } from "@primodiumxyz/reactive-tables";
import { Tooltip } from "@/components/core/Tooltip";
import { TransactionQueueMask } from "@/components/shared/TransactionQueueMask";
import { useContractCalls } from "@/hooks/useContractCalls";
-import { findEntriesWithPrefix } from "@/util/localStorage";
+import { HAPPY_STORAGE_PREFIX, isHappySessionKeyRegistered } from "@/util/localStorage";
import { Landing } from "./Landing";
export const Enter: React.FC = () => {
const { tables } = useCore();
const {
- playerAccount: { entity: playerEntity },
+ playerAccount: { address: playerAddress, worldContract, entity: playerEntity },
sessionAccount,
} = useAccountClient();
- const { grantAccessWithSignature, spawn } = useContractCalls();
+ const { spawn } = useContractCalls();
const navigate = useNavigate();
const location = useLocation();
const [showingToast, setShowingToast] = useState(false);
const [state, setState] = useState<"loading" | "delegate" | "play">("loading");
+
const confirmSkip = async () => {
toast.dismiss();
if (showingToast) await new Promise((resolve) => setTimeout(resolve, 500));
@@ -37,6 +37,9 @@ export const Enter: React.FC = () => {
Are you sure you want to skip? You will need to confirm every action with your external wallet.
+
+
+ You can still enable a session key within the game settings.
@@ -72,8 +75,9 @@ export const Enter: React.FC = () => {
},
);
};
+
useEffect(() => {
- if (!sessionAccount) {
+ if (!isHappySessionKeyRegistered(playerAddress)) {
setState("delegate");
} else {
setState("play");
@@ -93,13 +97,14 @@ export const Enter: React.FC = () => {
navigate("/game" + location.search);
};
- const handleDelegate = async () => {
- const storedKeys = findEntriesWithPrefix();
- const privateKey = storedKeys.length > 0 ? storedKeys[0].privateKey : generatePrivateKey();
- const account = privateKeyToAccount(privateKey);
- localStorage.setItem(STORAGE_PREFIX + account.address, privateKey);
+ const handleHappySessionKeyRegister = async () => {
+ if (!isHappySessionKeyRegistered(playerAddress)) {
+ // once this resolves, write a status into local storage that this has been done
+ await requestSessionKey(worldContract.address);
- await grantAccessWithSignature(privateKey, { id: defaultEntity });
+ localStorage.setItem(HAPPY_STORAGE_PREFIX + playerAddress, "true");
+ setState("play");
+ } else return;
};
return (
@@ -108,7 +113,7 @@ export const Enter: React.FC = () => {
{state === "delegate" && (
return true;
}
+ // this is fully for mud's delegate system - we may need none of this for happy session keys
const potentialAuthorizeds = query({ with: [tables.UserDelegationControl] }).reduce((prev, entity) => {
const key = decodeEntity(tables.UserDelegationControl.metadata.abiKeySchema, entity) as {
delegator: Address;
diff --git a/packages/client/src/util/localStorage.ts b/packages/client/src/util/localStorage.ts
index 7aaa5e576..361450fae 100644
--- a/packages/client/src/util/localStorage.ts
+++ b/packages/client/src/util/localStorage.ts
@@ -1,4 +1,4 @@
-import { Hex } from "viem";
+import { Address, Hex } from "viem";
import { STORAGE_PREFIX } from "@primodiumxyz/core";
@@ -35,3 +35,10 @@ export function getPrivateKey(publicKey: Hex): Hex | undefined {
if (!entry) return;
return entry as Hex;
}
+
+// [HAPPY_PRIM] storage helpers for session keys
+export const HAPPY_STORAGE_PREFIX = "[HAPPY_PRIM] sessionKeyRegistered:";
+
+export const isHappySessionKeyRegistered = (address: Address): boolean => {
+ return localStorage.getItem(HAPPY_STORAGE_PREFIX + address) === "true";
+};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 74db67c5d..b0180d5da 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -140,6 +140,9 @@ importers:
framer-motion:
specifier: ^10.12.18
version: 10.18.0(react-dom@18.3.1)(react@18.3.1)
+ jsdom:
+ specifier: ^24.1.0
+ version: 24.1.0
lodash:
specifier: ^4.17.21
version: 4.17.21
@@ -189,6 +192,9 @@ importers:
'@types/lodash':
specifier: ^4.14.195
version: 4.17.5
+ '@types/node':
+ specifier: ^22.15.17
+ version: 22.15.17
'@types/react':
specifier: ^18.0.26
version: 18.3.3
@@ -254,7 +260,7 @@ importers:
version: 5.5.2
vite:
specifier: ^3.2.3
- version: 3.2.10(@types/node@16.18.11)
+ version: 3.2.10(@types/node@22.15.17)
vite-plugin-comlink:
specifier: ^3.0.5
version: 3.0.5(comlink@4.4.1)(vite@3.2.10)
@@ -4428,7 +4434,7 @@ packages:
dependencies:
'@latticexyz/common': 2.0.9(typescript@5.5.2)(zod@3.24.1)
abitype: 1.0.0(typescript@5.5.2)(zod@3.24.1)
- debug: 4.3.5
+ debug: 4.4.0
rxjs: 7.5.5
viem: 2.9.20(typescript@5.5.2)(zod@3.24.1)
transitivePeerDependencies:
@@ -7032,6 +7038,12 @@ packages:
dependencies:
undici-types: 6.20.0
+ /@types/node@22.15.17:
+ resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==}
+ dependencies:
+ undici-types: 6.21.0
+ dev: true
+
/@types/normalize-package-data@2.4.4:
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
dev: true
@@ -7467,7 +7479,7 @@ packages:
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7)
magic-string: 0.27.0
react-refresh: 0.14.2
- vite: 3.2.10(@types/node@16.18.11)
+ vite: 3.2.10(@types/node@22.15.17)
transitivePeerDependencies:
- supports-color
dev: true
@@ -8118,7 +8130,7 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
dependencies:
- debug: 4.3.5
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -8127,10 +8139,9 @@ packages:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
dependencies:
- debug: 4.3.5
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
- dev: true
/aggregate-error@3.1.0:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
@@ -8487,7 +8498,6 @@ packages:
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
- dev: true
/atomic-sleep@1.0.0:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
@@ -9214,7 +9224,6 @@ packages:
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
- dev: true
/comlink@4.4.1:
resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==}
@@ -9529,7 +9538,6 @@ packages:
engines: {node: '>=18'}
dependencies:
rrweb-cssom: 0.6.0
- dev: true
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -9565,7 +9573,6 @@ packages:
dependencies:
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
- dev: true
/data-view-buffer@1.0.1:
resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
@@ -9657,7 +9664,6 @@ packages:
/decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
- dev: true
/decode-named-character-reference@1.0.2:
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
@@ -9737,7 +9743,6 @@ packages:
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
- dev: true
/delegates@1.0.0:
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
@@ -10109,7 +10114,6 @@ packages:
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
- dev: true
/env-ci@11.0.0:
resolution: {integrity: sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==}
@@ -11455,7 +11459,6 @@ packages:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
- dev: true
/forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -12022,7 +12025,6 @@ packages:
engines: {node: '>=18'}
dependencies:
whatwg-encoding: 3.1.1
- dev: true
/html-parse-stringify@3.0.1:
resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
@@ -12069,10 +12071,9 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
- dev: true
/http-shutdown@1.2.2:
resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
@@ -12093,7 +12094,7 @@ packages:
engines: {node: '>= 6'}
dependencies:
agent-base: 6.0.2
- debug: 4.3.5
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -12103,10 +12104,9 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
- dev: true
/human-signals@2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
@@ -12149,7 +12149,6 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
- dev: true
/idb-keyval@6.2.1:
resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==}
@@ -12491,7 +12490,6 @@ packages:
/is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
- dev: true
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
@@ -12937,13 +12935,12 @@ packages:
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
- ws: 8.17.1
+ ws: 8.18.0
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
- dev: true
/jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
@@ -14451,7 +14448,6 @@ packages:
/nwsapi@2.2.10:
resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==}
- dev: true
/oauth-sign@0.9.0:
resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
@@ -14856,7 +14852,6 @@ packages:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies:
entities: 4.5.0
- dev: true
/parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
@@ -15460,7 +15455,6 @@ packages:
/psl@1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
- dev: true
/pump@3.0.0:
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
@@ -15534,7 +15528,6 @@ packages:
/querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
- dev: true
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -16024,7 +16017,6 @@ packages:
/requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
- dev: true
/resolve-from@3.0.0:
resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==}
@@ -16153,11 +16145,9 @@ packages:
/rrweb-cssom@0.6.0:
resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
- dev: true
/rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
- dev: true
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -16239,7 +16229,6 @@ packages:
engines: {node: '>=v12.22.7'}
dependencies:
xmlchars: 2.2.0
- dev: true
/scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
@@ -17051,7 +17040,6 @@ packages:
/symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
- dev: true
/system-architecture@0.1.0:
resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
@@ -17413,7 +17401,6 @@ packages:
punycode: 2.3.1
universalify: 0.2.0
url-parse: 1.5.10
- dev: true
/tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
@@ -17429,7 +17416,6 @@ packages:
engines: {node: '>=18'}
dependencies:
punycode: 2.3.1
- dev: true
/traverse@0.6.9:
resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==}
@@ -17846,6 +17832,10 @@ packages:
/undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+ /undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ dev: true
+
/undici@5.28.4:
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
engines: {node: '>=14.0'}
@@ -17932,7 +17922,6 @@ packages:
/universalify@0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
- dev: true
/universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
@@ -18052,7 +18041,6 @@ packages:
dependencies:
querystringify: 2.2.0
requires-port: 1.0.0
- dev: true
/url-regex@3.2.0:
resolution: {integrity: sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==}
@@ -18284,7 +18272,7 @@ packages:
comlink: 4.4.1
json5: 2.2.1
magic-string: 0.26.7
- vite: 3.2.10(@types/node@16.18.11)
+ vite: 3.2.10(@types/node@22.15.17)
dev: true
/vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@3.2.10):
@@ -18298,13 +18286,13 @@ packages:
debug: 4.3.5
globrex: 0.1.2
tsconfck: 3.1.0(typescript@5.5.2)
- vite: 3.2.10(@types/node@16.18.11)
+ vite: 3.2.10(@types/node@22.15.17)
transitivePeerDependencies:
- supports-color
- typescript
dev: true
- /vite@3.2.10(@types/node@16.18.11):
+ /vite@3.2.10(@types/node@18.19.39):
resolution: {integrity: sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -18329,7 +18317,7 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 16.18.11
+ '@types/node': 18.19.39
esbuild: 0.15.18
postcss: 8.4.38
resolve: 1.22.10
@@ -18338,7 +18326,7 @@ packages:
fsevents: 2.3.3
dev: true
- /vite@3.2.10(@types/node@18.19.39):
+ /vite@3.2.10(@types/node@22.13.0):
resolution: {integrity: sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -18363,16 +18351,16 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 18.19.39
+ '@types/node': 22.13.0
esbuild: 0.15.18
postcss: 8.4.38
resolve: 1.22.10
rollup: 2.79.1
optionalDependencies:
fsevents: 2.3.3
- dev: true
+ dev: false
- /vite@3.2.10(@types/node@22.13.0):
+ /vite@3.2.10(@types/node@22.15.17):
resolution: {integrity: sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -18397,14 +18385,14 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 22.13.0
+ '@types/node': 22.15.17
esbuild: 0.15.18
postcss: 8.4.38
resolve: 1.22.10
rollup: 2.79.1
optionalDependencies:
fsevents: 2.3.3
- dev: false
+ dev: true
/vitest@0.32.4(happy-dom@14.12.3)(jsdom@24.1.0):
resolution: {integrity: sha512-3czFm8RnrsWwIzVDu/Ca48Y/M+qh3vOnF16czJm98Q/AN1y3B6PBsyV8Re91Ty5s7txKNjEhpgtGPcfdbh2MZg==}
@@ -18486,7 +18474,6 @@ packages:
engines: {node: '>=18'}
dependencies:
xml-name-validator: 5.0.0
- dev: true
/wagmi@2.10.7(@tanstack/react-query@5.48.0)(@types/react@18.3.3)(react-dom@18.3.1)(react-i18next@13.5.0)(react-native@0.78.2)(react@18.3.1)(typescript@5.5.2)(viem@2.9.20)(zod@3.23.8):
resolution: {integrity: sha512-RYh45bpqaPbQDcRYbfaiS0b5iZrEKVCCpjyFTJx83qtbkxZBvpT6MXy1rQbfLookVCgZz0PA3aYEYX8HJPajLg==}
@@ -18555,14 +18542,12 @@ packages:
/webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
- dev: true
/whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
dependencies:
iconv-lite: 0.6.3
- dev: true
/whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
@@ -18576,7 +18561,6 @@ packages:
/whatwg-mimetype@4.0.0:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
- dev: true
/whatwg-url@14.0.0:
resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
@@ -18584,7 +18568,6 @@ packages:
dependencies:
tr46: 5.0.0
webidl-conversions: 7.0.0
- dev: true
/whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
@@ -18825,6 +18808,7 @@ packages:
optional: true
utf-8-validate:
optional: true
+ dev: false
/ws@8.18.0:
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
@@ -18837,7 +18821,6 @@ packages:
optional: true
utf-8-validate:
optional: true
- dev: true
/xhr@2.6.0:
resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
@@ -18851,7 +18834,6 @@ packages:
/xml-name-validator@5.0.0:
resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
engines: {node: '>=18'}
- dev: true
/xml-parse-from-string@1.0.1:
resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==}
@@ -18879,7 +18861,6 @@ packages:
/xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
- dev: true
/xmlhttprequest-ssl@2.0.0:
resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==}