diff --git a/packages/apps/proof-of-us/.eslintrc.cjs b/packages/apps/proof-of-us/.eslintrc.cjs index 40f78351f9..c3fcde8c69 100644 --- a/packages/apps/proof-of-us/.eslintrc.cjs +++ b/packages/apps/proof-of-us/.eslintrc.cjs @@ -25,5 +25,6 @@ module.exports = { '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/strict-boolean-expressions': 'off', '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/consistent-type-imports': 'off', }, }; diff --git a/packages/apps/proof-of-us/.gitignore b/packages/apps/proof-of-us/.gitignore index 56d0ddf0d5..179f1f9b1a 100644 --- a/packages/apps/proof-of-us/.gitignore +++ b/packages/apps/proof-of-us/.gitignore @@ -10,4 +10,6 @@ certificates # generated files src/__generated__ -!src/__generated__/.gitkeep \ No newline at end of file +!src/__generated__/.gitkeep +.vercel +.env*.local diff --git a/packages/apps/proof-of-us/package.json b/packages/apps/proof-of-us/package.json index f237f9f919..cf05e536cd 100644 --- a/packages/apps/proof-of-us/package.json +++ b/packages/apps/proof-of-us/package.json @@ -31,6 +31,7 @@ "@kadena/kode-icons": "workspace:*", "@kadena/kode-ui": "workspace:*", "@kadena/pactjs": "workspace:*", + "@kadena/spirekey-sdk": "0.0.1-dev-12", "@pinata/sdk": "^2.1.0", "@vanilla-extract/css": "1.14.2", "@vanilla-extract/recipes": "0.5.1", diff --git a/packages/apps/proof-of-us/src/components/AccountProvider/AccountProvider.tsx b/packages/apps/proof-of-us/src/components/AccountProvider/AccountProvider.tsx index 21588bdf51..a5ee0ba159 100644 --- a/packages/apps/proof-of-us/src/components/AccountProvider/AccountProvider.tsx +++ b/packages/apps/proof-of-us/src/components/AccountProvider/AccountProvider.tsx @@ -1,9 +1,9 @@ 'use client'; import { env } from '@/utils/env'; import { getAccountCookieName } from '@/utils/getAccountCookieName'; -import { getReturnUrl } from '@/utils/getReturnUrl'; import { store } from '@/utils/socket/store'; -import { useRouter, useSearchParams } from 'next/navigation'; +import { connect, initSpireKey } from '@kadena/spirekey-sdk'; +import { useRouter } from 'next/navigation'; import type { FC, PropsWithChildren } from 'react'; import { createContext, useCallback, useEffect, useState } from 'react'; @@ -30,27 +30,17 @@ export const AccountProvider: FC = ({ children }) => { const [account, setAccount] = useState(); const [isMounted, setIsMounted] = useState(false); const router = useRouter(); - const searchParams = useSearchParams(); - const decodeAccount = useCallback((userResponse: string) => { - if (!userResponse) return; + const login = useCallback(async () => { try { - const account: IAccount = JSON.parse( - Buffer.from(userResponse, 'base64').toString(), - ); - return account; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (e: any) { - return; + setIsMounted(true); + const acc = await connect(env.NETWORKID, env.CHAINID); + setAccount(acc); + localStorage.setItem(getAccountCookieName(), JSON.stringify(acc)); + store.saveAlias(account); + } catch (e) { + localStorage.removeItem(getAccountCookieName()); } - }, []); - - const login = useCallback(() => { - router.push( - `${env.WALLET_URL}/connect?returnUrl=${getReturnUrl([ - 'user', - ])}&networkId=${env.NETWORKID}&chainId=${env.CHAINID}&optimistic=true`, - ); }, [router]); const logout = useCallback(() => { @@ -59,38 +49,22 @@ export const AccountProvider: FC = ({ children }) => { router.replace('/'); }, []); - const loginResponse = useCallback(async () => { - const innerSearchParams = new URLSearchParams(window.location.search); - const userResponse = innerSearchParams.has('user') - ? innerSearchParams.get('user') - : localStorage.getItem(getAccountCookieName()); - - if (!userResponse) { - setIsMounted(true); - return; + useEffect(() => { + const storage = localStorage.getItem(getAccountCookieName()); + if (storage) { + try { + setAccount(JSON.parse(storage)); + } catch (e) { + localStorage.removeItem(getAccountCookieName()); + } } - if (innerSearchParams.has('user')) { - localStorage.setItem(getAccountCookieName(), userResponse); - } - const account = decodeAccount(userResponse); - store.saveAlias(account); - setAccount(account); + initSpireKey({ + hostUrl: 'https://spirekey.kadena.io', + }); setIsMounted(true); - - if (searchParams.has('user')) { - setTimeout(() => { - router.replace(getReturnUrl(['user'])); - }, 100); - } - }, [setAccount, setIsMounted, searchParams, decodeAccount, router]); - - useEffect(() => { - loginResponse(); }, []); - console.log({ account }, account?.accountName); - return ( {children} diff --git a/packages/apps/proof-of-us/src/components/LoginBoundry/LoginBoundry.tsx b/packages/apps/proof-of-us/src/components/LoginBoundry/LoginBoundry.tsx index 452cbade9d..34569892e0 100644 --- a/packages/apps/proof-of-us/src/components/LoginBoundry/LoginBoundry.tsx +++ b/packages/apps/proof-of-us/src/components/LoginBoundry/LoginBoundry.tsx @@ -1,14 +1,30 @@ import { useAccount } from '@/hooks/account'; +import { Stack } from '@kadena/kode-ui'; import type { FC, PropsWithChildren } from 'react'; -import { useEffect } from 'react'; +import { Button } from '../Button/Button'; export const LoginBoundry: FC = ({ children }) => { const { account, isMounted, login } = useAccount(); - useEffect(() => { - if (!account && isMounted) { - login(); - } - }, [account, isMounted]); + const handleLogin = () => { + login(); + }; + + if (!isMounted) return; + + if (isMounted && !account) { + return ( + + + + ); + } + return <>{children}; }; diff --git a/packages/apps/proof-of-us/src/components/MintView/MintView.tsx b/packages/apps/proof-of-us/src/components/MintView/MintView.tsx deleted file mode 100644 index bbc7657535..0000000000 --- a/packages/apps/proof-of-us/src/components/MintView/MintView.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { useProofOfUs } from '@/hooks/proofOfUs'; -import { useSubmit } from '@/hooks/submit'; -import { getReturnUrl } from '@/utils/getReturnUrl'; -import { Stack } from '@kadena/kode-ui'; -import Link from 'next/link'; -import { useRouter } from 'next/router'; -import type { FC } from 'react'; -import { useEffect, useState } from 'react'; -import { Button } from '../Button/Button'; -import { ListSignees } from '../ListSignees/ListSignees'; -import { Modal } from '../Modal/Modal'; -import { ScreenHeight } from '../ScreenHeight/ScreenHeight'; -import { LoadingStatus } from '../Status/LoadingStatus'; - -interface IProps { - next: () => void; - prev: () => void; - status: number; -} - -export const MintView: FC = () => { - const { proofOfUs, signees, updateSignee, resetSignatures } = useProofOfUs(); - const { doSubmit, transaction } = useSubmit(); - const [uploadError, setUploadError] = useState(false); - const router = useRouter(); - - const handleMint = async () => { - if (!proofOfUs) return; - setUploadError(false); - - try { - await updateSignee({ signerStatus: 'success' }, true); - await doSubmit(); - } catch (e) { - console.error('SUBMIT ERR'); - setUploadError(true); - router.replace(`${getReturnUrl()}`); - return; - } - }; - - useEffect(() => { - if (!proofOfUs || !signees || !transaction) return; - - if (!proofOfUs.tx) { - throw new Error('no tx is found'); - } - handleMint(); - }, [proofOfUs?.tx, signees?.length, transaction]); - - if (!proofOfUs) return; - - return ( - - {uploadError && ( - {}}> - - Something went wrong with the upload. Hashes do not align. Please - try again - - - - - - - - )} - - - - ); -}; diff --git a/packages/apps/proof-of-us/src/components/MintView/style.css.ts b/packages/apps/proof-of-us/src/components/MintView/style.css.ts deleted file mode 100644 index a81444976f..0000000000 --- a/packages/apps/proof-of-us/src/components/MintView/style.css.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { globalStyle, style } from '@vanilla-extract/css'; - -export const qrClass = style({ - maxWidth: '500px', - maxHeight: '500px', - width: '100%', - height: '100%', - aspectRatio: '1/1', -}); - -globalStyle(`${qrClass} canvas`, { - width: '100%!important', - height: '100%!important', - aspectRatio: '1/1', -}); diff --git a/packages/apps/proof-of-us/src/components/ProofOfUsProvider/ProofOfUsProvider.tsx b/packages/apps/proof-of-us/src/components/ProofOfUsProvider/ProofOfUsProvider.tsx index 68e45a6b1f..8b8f4b8557 100644 --- a/packages/apps/proof-of-us/src/components/ProofOfUsProvider/ProofOfUsProvider.tsx +++ b/packages/apps/proof-of-us/src/components/ProofOfUsProvider/ProofOfUsProvider.tsx @@ -44,6 +44,7 @@ export interface IProofOfUsContext { hasSigned: () => Promise; isSignee: () => Promise; getSignee: () => Promise; + getSignees: () => Promise; updateSigneePing: (signee: IProofOfUsSignee) => Promise; updateProofOfUs: (value: any) => Promise; getSignature: (tx: IUnsignedCommand) => Promise; @@ -69,6 +70,7 @@ export const ProofOfUsContext = createContext({ hasSigned: async () => false, isSignee: async () => false, getSignee: async () => undefined, + getSignees: async () => [], updateSigneePing: async () => {}, updateProofOfUs: async () => {}, getSignature: async () => undefined, @@ -299,6 +301,12 @@ export const ProofOfUsProvider: FC = ({ children, proofOfUsId }) => { return signee; }; + const getSignees = async (): Promise => { + if (!proofOfUs) return []; + + return store.getProofOfUsSignees(proofOfUs.proofOfUsId); + }; + const updateSigneePing = async (signee: IProofOfUsSignee): Promise => { if (!proofOfUs) return; return store.updateSigneePing(proofOfUs, signee); @@ -359,6 +367,7 @@ export const ProofOfUsProvider: FC = ({ children, proofOfUsId }) => { hasSigned, isSignee, getSignee, + getSignees, updateSigneePing, getSignature, resetSignatures, diff --git a/packages/apps/proof-of-us/src/components/Providers/Providers.tsx b/packages/apps/proof-of-us/src/components/Providers/Providers.tsx index 6bb0300ace..d079fa05df 100644 --- a/packages/apps/proof-of-us/src/components/Providers/Providers.tsx +++ b/packages/apps/proof-of-us/src/components/Providers/Providers.tsx @@ -2,7 +2,7 @@ import { localStorageProvider } from '@/utils/localStorageProvider'; import type { NormalizedCacheObject } from '@apollo/client'; import { ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client'; - +import { darkThemeClass } from '@kadena/kode-ui/styles'; import { ThemeProvider } from 'next-themes'; import type { FC, PropsWithChildren } from 'react'; import { SWRConfig } from 'swr'; @@ -26,7 +26,15 @@ export const Providers: FC = ({ children }) => { - {children} + + {children} + diff --git a/packages/apps/proof-of-us/src/components/ShareView/ShareView.tsx b/packages/apps/proof-of-us/src/components/ShareView/ShareView.tsx index abc93e51e8..453d86fbf9 100644 --- a/packages/apps/proof-of-us/src/components/ShareView/ShareView.tsx +++ b/packages/apps/proof-of-us/src/components/ShareView/ShareView.tsx @@ -149,12 +149,9 @@ export const ShareView: FC = ({ prev, status }) => { const transactionData = await createTx(); if (!transactionData) return; - const transaction = Buffer.from( - JSON.stringify(transactionData.transaction), - ).toString('base64'); updateProofOfUs({ - tx: transaction, + tx: JSON.stringify(transactionData.transaction), requestKey: transactionData.transaction?.hash, tokenId: transactionData.tokenId, manifestData: JSON.stringify(transactionData.manifest), diff --git a/packages/apps/proof-of-us/src/features/CreateProofOfUs/CreateProofOfUs.tsx b/packages/apps/proof-of-us/src/features/CreateProofOfUs/CreateProofOfUs.tsx index 1092f617a0..805f8ae28c 100644 --- a/packages/apps/proof-of-us/src/features/CreateProofOfUs/CreateProofOfUs.tsx +++ b/packages/apps/proof-of-us/src/features/CreateProofOfUs/CreateProofOfUs.tsx @@ -1,6 +1,5 @@ import { AvatarEditor } from '@/components/AvatarEditor/AvatarEditor'; import { DetailView } from '@/components/DetailView/DetailView'; -import { MintView } from '@/components/MintView/MintView'; import { ShareView } from '@/components/ShareView/ShareView'; import { useProofOfUs } from '@/hooks/proofOfUs'; import { createProofOfUsID } from '@/utils/createProofOfUsID'; @@ -56,7 +55,6 @@ export const CreateProofOfUs: FC = ({ params }) => { {status === 1 && } {status === 2 && } {status === 3 && } - {status >= 4 && } ); }; diff --git a/packages/apps/proof-of-us/src/features/ScanAttendanceEvent/ScanAttendanceEvent.tsx b/packages/apps/proof-of-us/src/features/ScanAttendanceEvent/ScanAttendanceEvent.tsx index 57597f6b39..0203791429 100644 --- a/packages/apps/proof-of-us/src/features/ScanAttendanceEvent/ScanAttendanceEvent.tsx +++ b/packages/apps/proof-of-us/src/features/ScanAttendanceEvent/ScanAttendanceEvent.tsx @@ -6,15 +6,13 @@ import { useAccount } from '@/hooks/account'; import { useClaimAttendanceToken } from '@/hooks/data/claimAttendanceToken'; import { useSubmit } from '@/hooks/submit'; import { useTokens } from '@/hooks/tokens'; -import { useTransaction } from '@/hooks/transaction'; -import { env } from '@/utils/env'; -import { getReturnUrl } from '@/utils/getReturnUrl'; +import { ICommand } from '@kadena/client'; import { Stack } from '@kadena/kode-ui'; +import { sign } from '@kadena/spirekey-sdk'; import { isAfter, isBefore } from 'date-fns'; import Link from 'next/link'; -import { useRouter } from 'next/navigation'; import type { Dispatch, FC, SetStateAction } from 'react'; -import { useEffect, useMemo } from 'react'; +import { useMemo } from 'react'; interface IProps { data: IProofOfUsTokenMeta; @@ -29,11 +27,9 @@ export const ScanAttendanceEvent: FC = ({ isMinted, }) => { const { claim } = useClaimAttendanceToken(); - const router = useRouter(); const { account, isMounted, login } = useAccount(); const { addMintingData, tokens } = useTokens(); - const { doSubmit, isStatusLoading } = useSubmit(); - const { transaction } = useTransaction(); + const { doSubmit, isStatusLoading, setIsLoading } = useSubmit(); const tokenId = useMemo(() => { const token = tokens?.find((t) => t.info?.uri === data.manifestUri); @@ -42,14 +38,12 @@ export const ScanAttendanceEvent: FC = ({ const getProof = ( data: IProofOfUsTokenMeta, - transaction: string, + transaction: ICommand, ): IProofOfUsData => { - const tx = JSON.parse(Buffer.from(transaction, 'base64').toString()); - const proof: IProofOfUsData = { proofOfUsId: data.properties.eventId || '', type: 'attendance', - requestKey: tx.hash, + requestKey: transaction.hash, title: data.name, isReadyToSign: false, mintStatus: 'init', @@ -66,34 +60,27 @@ export const ScanAttendanceEvent: FC = ({ return proof; }; - const createProof = async () => { - if (!transaction || !account) return; - - const proof = getProof(data, transaction); - await addMintingData(proof); - await doSubmit(transaction, proof); - }; - - useEffect(() => { - createProof(); - }, [account, transaction]); - const handleClaim = async () => { const transaction = await claim(eventId); if (!transaction || !account) return; - const bufferedTx = Buffer.from(JSON.stringify(transaction)).toString( - 'base64', - ); - - router.push( - `${ - process.env.NEXT_PUBLIC_WALLET_URL - }sign#transaction=${bufferedTx}&chainId=${ - env.CHAINID - }&returnUrl=${getReturnUrl()} - `, - ); + try { + setIsLoading(true); + const { transactions, isReady } = await sign([transaction], [account]); + await isReady(); + + transactions.map(async (t) => { + // should perform check to see if all sigs are present + const proof = getProof(data, t as ICommand); + await addMintingData(proof); + await doSubmit( + Buffer.from(JSON.stringify(t)).toString('base64'), + proof, + ); + }); + } catch (e) { + setIsLoading(false); + } }; const startDate = new Date(data.startDate * 1000); diff --git a/packages/apps/proof-of-us/src/hooks/data/signToken.ts b/packages/apps/proof-of-us/src/hooks/data/signToken.ts index 69cd85cc69..991a29b2aa 100644 --- a/packages/apps/proof-of-us/src/hooks/data/signToken.ts +++ b/packages/apps/proof-of-us/src/hooks/data/signToken.ts @@ -1,77 +1,70 @@ import { useProofOfUs } from '@/hooks/proofOfUs'; -import { env } from '@/utils/env'; -import { getReturnHostUrl, getReturnUrl } from '@/utils/getReturnUrl'; +import { getReturnHostUrl } from '@/utils/getReturnUrl'; +import { sign as signSpireKey } from '@kadena/spirekey-sdk'; import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useAccount } from '../account'; -import { useTransaction } from '../transaction'; +import { useSubmit } from '../submit'; export const useSignToken = () => { const { updateSignee, proofOfUs, - hasSigned, + signees, updateProofOfUs, getSignature, isInitiator, } = useProofOfUs(); - const [isLoading, setIsLoading] = useState(false); + // const [isLoading, setIsLoading] = useState(false); const [hasError, setHasError] = useState(false); const [data] = useState(undefined); const { account } = useAccount(); const router = useRouter(); - const { transaction } = useTransaction(); + const { doSubmit, setIsLoading, isStatusLoading } = useSubmit(); - const sign = async () => { - const signed = await hasSigned(); - - if (!transaction || signed || !proofOfUs) return; - const tx = JSON.parse(Buffer.from(transaction, 'base64').toString()); - - const signature = await getSignature(tx); - await updateSignee({ signerStatus: 'success', signature }, true); + const signToken = async () => { + if (!proofOfUs || !account || !signees) return; + await updateSignee({ signerStatus: 'signing' }, true); + setIsLoading(true); + setHasError(false); - const accountIsInitiator = await isInitiator(); - await updateProofOfUs({ - // tx: transaction, - status: accountIsInitiator ? 4 : 3, - }); + console.log(proofOfUs.tx); + try { + setIsLoading(true); - setIsLoading(false); - setHasError(false); + console.log(22); + const { transactions, isReady } = await signSpireKey( + [JSON.parse(proofOfUs.tx)], + [account], + ); - //when the account is not the initiator you want to redirect. - //if they are the initiator, you dont, so the app will submit the nft - if (accountIsInitiator) return; + console.log('before'); + await isReady(); - router.replace( - `${getReturnHostUrl()}/user/proof-of-us/mint/${tx.hash}?id=${ - proofOfUs.proofOfUsId - }`, - ); - }; + console.log(transactions); + const signature = await getSignature(transactions[0]); - useEffect(() => { - if (!proofOfUs) return; - sign(); - }, [transaction, proofOfUs]); + await updateSignee({ signerStatus: 'success', signature }, true); - const signToken = async () => { - if (!proofOfUs || !account) return; - setIsLoading(true); - setHasError(false); - const transaction = proofOfUs.tx; - await updateSignee({ signerStatus: 'signing' }, true); + const accountIsInitiator = await isInitiator(); + await updateProofOfUs({ + tx: JSON.stringify(transactions[0]), + status: 3, + }); - router.push( - `${ - process.env.NEXT_PUBLIC_WALLET_URL - }sign#transaction=${transaction}&chainId=${ - env.CHAINID - }&returnUrl=${getReturnUrl()} - `, - ); + if (accountIsInitiator) { + await doSubmit(); + } else { + router.replace( + `${getReturnHostUrl()}/user/proof-of-us/mint/${transactions[0].hash}?id=${ + proofOfUs.proofOfUsId + }`, + ); + } + } catch (e) { + setIsLoading(false); + } }; - return { isLoading, hasError, data, signToken }; + return { isLoading: isStatusLoading, hasError, data, signToken }; }; diff --git a/packages/apps/proof-of-us/src/hooks/submit.ts b/packages/apps/proof-of-us/src/hooks/submit.ts index ce5a0cf222..f6e7674589 100644 --- a/packages/apps/proof-of-us/src/hooks/submit.ts +++ b/packages/apps/proof-of-us/src/hooks/submit.ts @@ -2,9 +2,8 @@ import { getClient } from '@/utils/client'; import { getReturnHostUrl, getReturnUrl } from '@/utils/getReturnUrl'; import { setSignatures } from '@/utils/setSignatures'; import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useProofOfUs } from './proofOfUs'; -import { useTransaction } from './transaction'; export enum SubmitStatus { IDLE = 'idle', @@ -16,48 +15,30 @@ export enum SubmitStatus { } export const useSubmit = () => { - const { proofOfUs, signees } = useProofOfUs(); + const { proofOfUs, getSignees } = useProofOfUs(); const [result, setResult] = useState({}); const [status, setStatus] = useState(SubmitStatus.IDLE); - const [tx, setTx] = useState(null); - const [preview, setPreview] = useState(null); + const [isLoading, setIsLoading] = useState(false); const router = useRouter(); - const { transaction } = useTransaction(); - - const processTransaction = async (transaction: string) => { - const client = getClient(); - const tx = JSON.parse(Buffer.from(transaction, 'base64').toString()); - setTx(tx); - - if (tx.sigs.filter((x: any) => x === null).length) - return setStatus(SubmitStatus.INCOMPLETE); - - const res = await client.local(tx); - setPreview(res); - }; - - useEffect(() => { - if (!transaction) return; - setStatus(SubmitStatus.SUBMITABLE); - processTransaction(transaction); - }, [transaction]); - const doSubmit = async (txArg?: string, proof?: IProofOfUsData) => { - const innerTransaction = txArg ? txArg : transaction; const innerProofOfUs = proof ? proof : proofOfUs; - console.log(innerTransaction); + const innerTransaction = txArg + ? JSON.parse(Buffer.from(txArg, 'base64').toString()) + : JSON.parse(innerProofOfUs?.tx); + if (!innerTransaction) return; setStatus(SubmitStatus.LOADING); const client = getClient(); + const latestSignees = await getSignees(); + const signedTransaction = txArg ? innerTransaction - : setSignatures(innerTransaction, signees); + : setSignatures(innerTransaction, latestSignees); - const tx = JSON.parse(Buffer.from(signedTransaction, 'base64').toString()); try { - await client.submit(tx); + await client.submit(signedTransaction); if (!innerProofOfUs?.requestKey) { router.replace(`${getReturnHostUrl()}/user`); @@ -82,20 +63,18 @@ export const useSubmit = () => { } }; - const isStatusLoading = - status !== SubmitStatus.IDLE && - status !== SubmitStatus.INCOMPLETE && - status !== SubmitStatus.SUBMITABLE && - status !== SubmitStatus.SUCCESS && - status !== SubmitStatus.ERROR; + // const isStatusLoading = + // status !== SubmitStatus.IDLE && + // status !== SubmitStatus.INCOMPLETE && + // status !== SubmitStatus.SUBMITABLE && + // status !== SubmitStatus.SUCCESS && + // status !== SubmitStatus.ERROR; return { doSubmit, - transaction, - tx, - preview, result, status, SubmitStatus, - isStatusLoading, + isStatusLoading: isLoading, + setIsLoading, }; }; diff --git a/packages/apps/proof-of-us/src/hooks/transaction.ts b/packages/apps/proof-of-us/src/hooks/transaction.ts deleted file mode 100644 index 61397fb465..0000000000 --- a/packages/apps/proof-of-us/src/hooks/transaction.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useEffect, useState } from 'react'; - -export const useTransaction = () => { - const [transaction, setTransaction] = useState(); - - useEffect(() => { - const searchParams = new URLSearchParams( - window.location.hash.replace(/^#/, '?'), - ); - const tx = searchParams.get('transaction'); - setTransaction(tx); - }, []); - - return { - transaction, - }; -}; diff --git a/packages/apps/proof-of-us/src/types.d.ts b/packages/apps/proof-of-us/src/types.d.ts index 4676316dee..f031886097 100644 --- a/packages/apps/proof-of-us/src/types.d.ts +++ b/packages/apps/proof-of-us/src/types.d.ts @@ -1,17 +1,14 @@ +/// + type IAccountCrendentialType = 'WebAuthn' | 'ED25519'; +type IAccount = ConnectedAccount; + interface IAccountCrendential { publicKey: string; type: IAccountCrendentialType; } -interface IAccount { - accountName: string; - alias: string; - pendingTxIds: string[]; - credentials: IAccountCrendential[]; -} - type IBuildStatusValues = 0 | 1 | 2 | 3 | 4; type ToastType = 'error' | 'success' | 'info'; diff --git a/packages/apps/proof-of-us/src/utils/__tests__/setSignatures.test.ts b/packages/apps/proof-of-us/src/utils/__tests__/setSignatures.test.ts index 0478117368..6f1369402d 100644 --- a/packages/apps/proof-of-us/src/utils/__tests__/setSignatures.test.ts +++ b/packages/apps/proof-of-us/src/utils/__tests__/setSignatures.test.ts @@ -19,12 +19,7 @@ describe('utils setSignatures', () => { sigs: [], }; - const bufferedTx = Buffer.from(JSON.stringify(tx)).toString('base64'); - - const signedBufferedTx = setSignatures(bufferedTx, signees); - const signedTx = JSON.parse( - Buffer.from(signedBufferedTx, 'base64').toString(), - ); + const signedTx = setSignatures(tx, signees); expect(signedTx.sigs.length).toEqual(5); diff --git a/packages/apps/proof-of-us/src/utils/cleanAccountForStore.ts b/packages/apps/proof-of-us/src/utils/cleanAccountForStore.ts new file mode 100644 index 0000000000..ddc477c50a --- /dev/null +++ b/packages/apps/proof-of-us/src/utils/cleanAccountForStore.ts @@ -0,0 +1,3 @@ +export const cleanAccountForStore = (accountName: string): string => { + return accountName.replace(/\./g, ''); +}; diff --git a/packages/apps/proof-of-us/src/utils/getSigneeAccount.ts b/packages/apps/proof-of-us/src/utils/getSigneeAccount.ts index a53e6b7716..7bb82ce14d 100644 --- a/packages/apps/proof-of-us/src/utils/getSigneeAccount.ts +++ b/packages/apps/proof-of-us/src/utils/getSigneeAccount.ts @@ -4,14 +4,18 @@ export const getSigneeAccount = ( ): IProofOfUsSignee => { const signer = signees?.find((c) => c.accountName === account.accountName); - const credential = account.credentials[0]; + // TODO: probably add a list of keys that need to sign + const publicKey = account.devices[0].guard.keys[0]; if (signer) return signer; + delete account.isReady; + return { + ...account, accountName: account.accountName, alias: account.alias, initiator: false, signerStatus: 'init', - publicKey: credential.publicKey, + publicKey, }; }; diff --git a/packages/apps/proof-of-us/src/utils/proofOfUs.ts b/packages/apps/proof-of-us/src/utils/proofOfUs.ts index e0c97db238..436b7523f9 100644 --- a/packages/apps/proof-of-us/src/utils/proofOfUs.ts +++ b/packages/apps/proof-of-us/src/utils/proofOfUs.ts @@ -125,9 +125,9 @@ export const claimAttendanceToken = async ( account: IAccount, ): Promise => { const eventId = decodeURIComponent(id); - const credential = account.credentials[0]; + const pubKey = account.devices[0].guard.keys[0]; - if (!credential) { + if (!pubKey) { throw new Error('credential of account not found'); } @@ -136,7 +136,7 @@ export const claimAttendanceToken = async ( `(${process.env.NEXT_PUBLIC_NAMESPACE}.proof-of-us.mint-attendance-token "${eventId}" "${account.accountName}" - (${process.env.NEXT_PUBLIC_WEBAUTHN_NAMESPACE}.webauthn-wallet.get-wallet-guard "${account.accountName}") + (at 'guard (coin.details "${account.accountName}")) )`, ) .addData('event_id', `${eventId}`) @@ -148,7 +148,7 @@ export const claimAttendanceToken = async ( }) .addSigner( { - pubKey: `${credential.publicKey}`, + pubKey, scheme: 'WebAuthn', }, (withCap) => [ @@ -202,14 +202,14 @@ export const createConnectTokenTransaction = async ( signees: IProofOfUsSignee[], account: IAccount, ): Promise => { - const credential = account.credentials[0]; + const pubKey = account.devices[0].guard.keys[0]; const collectionId = process.env.NEXT_PUBLIC_CONNECTION_COLLECTIONID ?? ''; if (!collectionId) { throw new Error('collectionId not found'); } - if (!credential) { + if (!pubKey) { throw new Error('credential of account not found'); } @@ -225,7 +225,8 @@ export const createConnectTokenTransaction = async ( .execution( `(${process.env.NEXT_PUBLIC_NAMESPACE}.proof-of-us.create-and-mint-connection-token "${manifestUri}" - (map (${process.env.NEXT_PUBLIC_WEBAUTHN_NAMESPACE}.webauthn-wallet.get-wallet-guard) [${guardString}]) + + (map (lambda (accountName) (at 'guard (coin.details accountName))) [${guardString}]) )`, ) .addData('collection_id', collectionId) diff --git a/packages/apps/proof-of-us/src/utils/setSignatures.ts b/packages/apps/proof-of-us/src/utils/setSignatures.ts index bff8e82d59..40e27493be 100644 --- a/packages/apps/proof-of-us/src/utils/setSignatures.ts +++ b/packages/apps/proof-of-us/src/utils/setSignatures.ts @@ -1,8 +1,10 @@ +import { IUnsignedCommand } from '@kadena/client'; + export const setSignatures = ( - tx: string, + tx: any, signees: IProofOfUsSignee[] = [], -): string => { - const innerTx = JSON.parse(Buffer.from(tx, 'base64').toString()); +): IUnsignedCommand => { + const innerTx = tx; const { signers } = JSON.parse(innerTx.cmd); const sigs = signers.reduce((acc: any, val: any) => { const pubKey = val.pubKey; @@ -16,5 +18,5 @@ export const setSignatures = ( return acc; }, []); - return Buffer.from(JSON.stringify({ ...innerTx, sigs })).toString('base64'); + return { ...innerTx, sigs }; }; diff --git a/packages/apps/proof-of-us/src/utils/socket/store.ts b/packages/apps/proof-of-us/src/utils/socket/store.ts index 316bdc43e1..6e16b7a772 100644 --- a/packages/apps/proof-of-us/src/utils/socket/store.ts +++ b/packages/apps/proof-of-us/src/utils/socket/store.ts @@ -1,6 +1,7 @@ import { BUILDSTATUS } from '@/constants'; import { child, get, off, onValue, ref, set, update } from 'firebase/database'; import type { Dispatch, SetStateAction } from 'react'; +import { cleanAccountForStore } from '../cleanAccountForStore'; import { convertSignersObjectToArray } from '../convertSignersObjectToArray'; import { database, dbRef } from '../firebase'; import { isAlreadySigning } from '../isAlreadySigning'; @@ -53,11 +54,17 @@ const ProofOfUsStore = () => { date: Date.now(), }; - await set(ref(database, `signees/${proofOfUsId}/${account.accountName}`), { - ...account, - signerStatus: 'init', - initiator: true, - }); + await set( + ref( + database, + `signees/${proofOfUsId}/${cleanAccountForStore(account.accountName)}`, + ), + { + ...account, + signerStatus: 'init', + initiator: true, + }, + ); await set(ref(database, `data/${proofOfUsId}`), obj); }; @@ -166,7 +173,10 @@ const ProofOfUsStore = () => { }; return await update( - ref(database, `signees/${proofOfUs.proofOfUsId}/${account.accountName}`), + ref( + database, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(account.accountName)}`, + ), signee, ); }; @@ -176,7 +186,10 @@ const ProofOfUsStore = () => { account: IProofOfUsSignee, ) => { return await set( - ref(database, `signees/${proofOfUs.proofOfUsId}/${account.accountName}`), + ref( + database, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(account.accountName)}`, + ), null, ); }; @@ -190,7 +203,7 @@ const ProofOfUsStore = () => { return await set( ref( database, - `signees/${proofOfUs.proofOfUsId}/${account.accountName}/signerStatus`, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(account.accountName)}/signerStatus`, ), newStatus, ); @@ -201,7 +214,10 @@ const ProofOfUsStore = () => { account: IProofOfUsSignee, ) => { return await set( - ref(database, `signees/${proofOfUs.proofOfUsId}/${account.accountName}`), + ref( + database, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(account.accountName)}`, + ), account, ); }; @@ -213,7 +229,7 @@ const ProofOfUsStore = () => { return await set( ref( database, - `signees/${proofOfUs.proofOfUsId}/${signee.accountName}/lastPingTime`, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(signee.accountName)}/lastPingTime`, ), Date.now(), ); @@ -226,7 +242,10 @@ const ProofOfUsStore = () => { const promises = signees.map((signee) => { delete signee.signature; return set( - ref(database, `signees/${proofOfUs.proofOfUsId}/${signee.accountName}`), + ref( + database, + `signees/${proofOfUs.proofOfUsId}/${cleanAccountForStore(signee.accountName)}`, + ), { ...signee, signerStatus: @@ -287,7 +306,10 @@ const ProofOfUsStore = () => { if (!account) return; const accData = { alias: account.alias, accountName: account.accountName }; - await update(ref(database, `accounts/${account.accountName}`), accData); + await update( + ref(database, `accounts/${cleanAccountForStore(account.accountName)}`), + accData, + ); }; const saveLeaderboardAccounts = async (accounts: IAccountLeaderboard[]) => { const obj = accounts.reduce( diff --git a/packages/apps/tools/src/components/Global/Ace/styles.css.ts b/packages/apps/tools/src/components/Global/Ace/styles.css.ts index ffb9c82e03..e7d5ecfd99 100644 --- a/packages/apps/tools/src/components/Global/Ace/styles.css.ts +++ b/packages/apps/tools/src/components/Global/Ace/styles.css.ts @@ -5,7 +5,7 @@ export const containerStyle = style({ }); /* - * elements get a global style (which includes font-family) from the `react-ui` library, we + * elements get a global style (which includes font-family) from the `kode-ui` library, we * need to reset it here otherwise code in the editor won't be rendered as a monospace font. */ globalStyle(`${containerStyle} span`, { fontFamily: 'inherit !important' }); diff --git a/packages/e2e/e2e-base/package.json b/packages/e2e/e2e-base/package.json index af3e2f1fa5..21fbed0cfc 100644 --- a/packages/e2e/e2e-base/package.json +++ b/packages/e2e/e2e-base/package.json @@ -32,12 +32,12 @@ "@kadena-dev/lint-package": "workspace:*", "@kadena-dev/markdown": "workspace:*", "@kadena/types": "workspace:*", - "@playwright/test": "^1.44.0", + "@playwright/test": "^1.45.3", "@rushstack/eslint-config": "~3.6.9", "@types/node": "^20.12.7", "directory-tree": "3.5.1", "eslint": "^8.45.0", - "eslint-plugin-playwright": "1.6.1", + "eslint-plugin-playwright": "1.6.2", "prettier": "~3.2.5" } } diff --git a/packages/e2e/e2e-base/src/fixtures/shared/page-obects.fixture.ts b/packages/e2e/e2e-base/src/fixtures/shared/page-obects.fixture.ts index c36e9e007c..522d62f6c3 100644 --- a/packages/e2e/e2e-base/src/fixtures/shared/page-obects.fixture.ts +++ b/packages/e2e/e2e-base/src/fixtures/shared/page-obects.fixture.ts @@ -1,10 +1,14 @@ import { test as baseTest } from '@playwright/test'; import { DocsAppIndex } from '../../page-objects/docs-app/docsApp.index'; +import { ProofOfUsAppIndex } from '../../page-objects/proof-of-us/proofOfusApp.index'; +import { SpireKeyIndex } from '../../page-objects/spirekey/spirekeyInline.index'; import { ToolsAppIndex } from '../../page-objects/tools-app/toolsApp.index'; export const test = baseTest.extend<{ toolsApp: ToolsAppIndex; docsApp: DocsAppIndex; + proofOfusApp: ProofOfUsAppIndex; + spirekeyApp: SpireKeyIndex; }>({ toolsApp: async ({ page }, use) => { await use(new ToolsAppIndex(page)); @@ -12,4 +16,10 @@ export const test = baseTest.extend<{ docsApp: async ({ page }, use) => { await use(new DocsAppIndex(page)); }, + proofOfusApp: async ({}, use) => { + await use(new ProofOfUsAppIndex()); + }, + spirekeyApp: async ({}, use) => { + await use(new SpireKeyIndex()); + }, }); diff --git a/packages/e2e/e2e-base/src/fixtures/shared/persona.fixture.ts b/packages/e2e/e2e-base/src/fixtures/shared/persona.fixture.ts index 20bdf126a8..097899ec2a 100644 --- a/packages/e2e/e2e-base/src/fixtures/shared/persona.fixture.ts +++ b/packages/e2e/e2e-base/src/fixtures/shared/persona.fixture.ts @@ -12,62 +12,6 @@ export const test = baseTest.extend<{ signer7: Page; signer8: Page; signer9: Page; - signer10: Page; - signer11: Page; - signer12: Page; - signer13: Page; - signer14: Page; - signer15: Page; - signer16: Page; - signer17: Page; - signer18: Page; - signer19: Page; - signer20: Page; - signer21: Page; - signer22: Page; - signer23: Page; - signer24: Page; - signer25: Page; - signer26: Page; - signer27: Page; - signer28: Page; - signer29: Page; - signer30: Page; - signer31: Page; - signer32: Page; - signer33: Page; - signer34: Page; - signer35: Page; - signer36: Page; - signer37: Page; - signer38: Page; - signer39: Page; - signer40: Page; - signer41: Page; - signer42: Page; - signer43: Page; - signer44: Page; - signer45: Page; - signer46: Page; - signer47: Page; - signer48: Page; - signer49: Page; - signer50: Page; - signer51: Page; - signer52: Page; - signer53: Page; - signer54: Page; - signer55: Page; - signer56: Page; - signer57: Page; - signer58: Page; - signer59: Page; - signer60: Page; - signer61: Page; - signer62: Page; - signer63: Page; - signer64: Page; - signer65: Page; }>({ initiator: async ({ browser }, use) => { const context = await browser.newContext(); @@ -129,340 +73,4 @@ export const test = baseTest.extend<{ await use(customPage); await context.close(); }, - signer10: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer11: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer12: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer13: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer14: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer15: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer16: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer17: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer18: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer19: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer20: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer21: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer22: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer23: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer24: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer25: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer26: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer27: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer28: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer29: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer30: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer31: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer32: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer33: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer34: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer35: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer36: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer37: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer38: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer39: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer40: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer41: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer42: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer43: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer44: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer45: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer46: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer47: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer48: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer49: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer50: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer51: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer52: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer53: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer54: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer55: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer56: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer57: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer58: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer59: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer60: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer61: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer62: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer63: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer64: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, - signer65: async ({ browser }, use) => { - const context = await browser.newContext(); - const customPage = await context.newPage(); - await use(customPage); - await context.close(); - }, }); diff --git a/packages/e2e/e2e-base/src/helpers/spirekey/webauthn.helper.ts b/packages/e2e/e2e-base/src/helpers/spirekey/webauthn.helper.ts index 3ad7f39181..9c1af813f6 100644 --- a/packages/e2e/e2e-base/src/helpers/spirekey/webauthn.helper.ts +++ b/packages/e2e/e2e-base/src/helpers/spirekey/webauthn.helper.ts @@ -1,12 +1,13 @@ import type { CDPSession, Page } from '@playwright/test'; export class WebAuthNHelper { - public async enableWebAuthN( + public async enableVirtualAuthenticator( actor: Page, - ): Promise<{ id: string; cdp: CDPSession }> { + credentials?, + ): Promise<{ authenticatorId: string; cdpSession: CDPSession }> { const cdpSession = await actor.context().newCDPSession(actor); await cdpSession.send('WebAuthn.enable'); - const id = await cdpSession.send('WebAuthn.addVirtualAuthenticator', { + const result = await cdpSession.send('WebAuthn.addVirtualAuthenticator', { options: { protocol: 'ctap2', ctap2Version: 'ctap2_1', @@ -16,9 +17,23 @@ export class WebAuthNHelper { hasResidentKey: true, }, }); + + if (credentials !== undefined) { + await this.addCredential(result.authenticatorId, credentials, cdpSession); + } return { - id: id.authenticatorId, - cdp: cdpSession, + authenticatorId: result.authenticatorId, + cdpSession: cdpSession, }; } + + public async getCredential(authenticatorId: string, cdpSession: CDPSession) { + return cdpSession.send('WebAuthn.getCredentials', { + authenticatorId, + }); + } + + public async addCredential(authenticatorId, credential, cdpSession) { + cdpSession.send('WebAuthn.addCredential', { authenticatorId, credential }); + } } diff --git a/packages/e2e/e2e-base/src/page-objects/proof-of-us/proofOfusApp.index.ts b/packages/e2e/e2e-base/src/page-objects/proof-of-us/proofOfusApp.index.ts index d15058ac3c..d609bef1a7 100644 --- a/packages/e2e/e2e-base/src/page-objects/proof-of-us/proofOfusApp.index.ts +++ b/packages/e2e/e2e-base/src/page-objects/proof-of-us/proofOfusApp.index.ts @@ -28,6 +28,13 @@ export class ProofOfUsAppIndex { return shareUrl; } + public async loginToMintWith(actor: Page): Promise { + await actor.getByRole('button', { name: 'Login to mint' }).click(); + } + public async loginToMintWithSigner(actor: Page): Promise { + await actor.getByRole('button', { name: 'Login' }).click(); + } + public async disableSigningFor( actor: Page, targetSignee: string, @@ -51,7 +58,7 @@ export class ProofOfUsAppIndex { await actor.getByRole('button', { name: 'SIGN' }).first().click(); } - public async uploadProofWith(actor: Page): Promise { + public async signAndMintWith(actor: Page): Promise { await actor.getByRole('button', { name: 'SIGN & MINT' }).waitFor(); await actor.getByRole('button', { name: 'SIGN & MINT' }).first().click(); } @@ -63,4 +70,13 @@ export class ProofOfUsAppIndex { expectedSigneeCount, ); } + + public async logBlockExplorerUrl(actor: Page): Promise { + const blockExplorerUrl = await actor + .getByRole('link', { name: 'Click Here' }) + .first() + .getAttribute('href'); + + console.log(blockExplorerUrl); + } } diff --git a/packages/e2e/e2e-base/src/page-objects/spirekey/spirekeyInline.index.ts b/packages/e2e/e2e-base/src/page-objects/spirekey/spirekeyInline.index.ts new file mode 100644 index 0000000000..2acf3f350c --- /dev/null +++ b/packages/e2e/e2e-base/src/page-objects/spirekey/spirekeyInline.index.ts @@ -0,0 +1,40 @@ +import type { Page } from '@playwright/test'; +import { WebAuthNHelper } from '../../helpers/spirekey/webauthn.helper'; + +const webAuthNHelper = new WebAuthNHelper(); + +export class SpireKeyIndex { + public constructor() {} + + public async createSpireKeyAccountFor( + actor: Page, + wait = false, + ): Promise { + const authenticator = + await webAuthNHelper.enableVirtualAuthenticator(actor); + + await actor.getByRole('button', { name: 'Register' }).click(); + await actor.getByRole('button', { name: 'Create' }).click(); + await actor.getByRole('button', { name: 'Continue' }).click(); + + await actor.getByRole('heading', { name: 'Register Account' }).waitFor(); + if (wait) { + await actor.waitForTimeout(45000); + } + const credential = await webAuthNHelper.getCredential( + authenticator.authenticatorId, + authenticator.cdpSession, + ); + await actor.getByRole('button', { name: 'Complete' }).click(); + + return credential.credentials[0]; + } + + public async signTransaction(actor: Page, credential): Promise { + await webAuthNHelper.enableVirtualAuthenticator(actor, credential); + await actor.getByRole('heading', { name: 'Permissions' }).click(); + await actor.waitForTimeout(5000); + + await actor.getByRole('button', { name: 'Sign' }).click(); + } +} diff --git a/packages/e2e/e2e-docs/package.json b/packages/e2e/e2e-docs/package.json index 0e29388036..fe23c2381c 100644 --- a/packages/e2e/e2e-docs/package.json +++ b/packages/e2e/e2e-docs/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@kadena/docs": "workspace:*", - "@playwright/test": "^1.44.0" + "@playwright/test": "^1.45.3" }, "devDependencies": { "@kadena-dev/e2e-base": "workspace:*", @@ -28,7 +28,7 @@ "@rushstack/eslint-config": "~3.6.9", "@types/node": "^20.12.7", "eslint": "^8.45.0", - "eslint-plugin-playwright": "1.6.1", + "eslint-plugin-playwright": "1.6.2", "prettier": "~3.2.5" } } diff --git a/packages/e2e/e2e-graph/package.json b/packages/e2e/e2e-graph/package.json index 93088003fa..e7e219411b 100644 --- a/packages/e2e/e2e-graph/package.json +++ b/packages/e2e/e2e-graph/package.json @@ -30,13 +30,13 @@ "@kadena-dev/markdown": "workspace:*", "@kadena-dev/shared-config": "workspace:*", "@kadena/types": "workspace:*", - "@playwright/test": "^1.44.0", + "@playwright/test": "^1.45.3", "@rushstack/eslint-config": "~3.6.9", "@types/node": "^20.12.7", "directory-tree": "3.5.1", "eslint": "^8.45.0", "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-playwright": "1.6.1", + "eslint-plugin-playwright": "1.6.2", "graphql-ws": "^5.16.0", "parse-md": "2.0.5", "playwright-i18next-fixture": "^1.0.0", diff --git a/packages/e2e/e2e-proof-of-us/package.json b/packages/e2e/e2e-proof-of-us/package.json index 7cb7e632ed..06366f502a 100644 --- a/packages/e2e/e2e-proof-of-us/package.json +++ b/packages/e2e/e2e-proof-of-us/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "@kadena/tools": "workspace:*", - "@playwright/test": "^1.44.0" + "@playwright/test": "^1.45.3" }, "devDependencies": { "@kadena-dev/e2e-base": "workspace:*", @@ -30,7 +30,7 @@ "@types/node": "^20.12.7", "eslint": "^8.45.0", "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-playwright": "1.6.1", + "eslint-plugin-playwright": "1.6.2", "prettier": "~3.2.5" } } diff --git a/packages/e2e/e2e-proof-of-us/tests/test-1.spec.ts b/packages/e2e/e2e-proof-of-us/tests/test-1.spec.ts index 801aa45ced..4d72d9c1cb 100644 --- a/packages/e2e/e2e-proof-of-us/tests/test-1.spec.ts +++ b/packages/e2e/e2e-proof-of-us/tests/test-1.spec.ts @@ -1,57 +1,66 @@ import { test } from '@kadena-dev/e2e-base/src/fixtures/shared/test.fixture'; -import { ProofOfUsAppIndex } from '@kadena-dev/e2e-base/src/page-objects/proof-of-us/proofOfusApp.index'; -import { SpireKeyIndex } from '@kadena-dev/e2e-base/src/page-objects/spirekey/spirekeyApp.index'; import { expect } from '@playwright/test'; const proofTitle = 'Super Fancy Title'; -const spireKey = new SpireKeyIndex(); -const proofOfUs = new ProofOfUsAppIndex(); let shareUrl: string; +let initiatorCredential: object; +let signerCredential: object; +let signer2Credential: object; + +const TESTURL = 'http://localhost:3000/'; test('1 Initiator, 1 signers. all participants sign -> Should be able to mint the connection token @xs', async ({ initiator, signer1, + spirekeyApp, + proofOfusApp, }) => { - await test.step('Create account in SpireKey and initiate a connection in Proof of Us.', async () => { - await initiator.goto('https://proof-of-agao4ohsw-kadena-js.vercel.app/'); - // Initiator: Create a SpireKey account - await initiator.getByRole('button', { name: 'Login to mint' }).click(); - await spireKey.createSpireKeyAccountFor(initiator, 'initiator'); - shareUrl = await proofOfUs.createProofWith(initiator, proofTitle); + await test.step('Create an account for the initiator and create proof', async () => { + await initiator.goto(TESTURL); + const popupPromise = initiator.waitForEvent('popup'); + await proofOfusApp.loginToMintWith(initiator); + const initiatorPopup = await popupPromise; + initiatorCredential = await spirekeyApp.createSpireKeyAccountFor( + initiatorPopup, + true, + ); + + shareUrl = await proofOfusApp.createProofWith(initiator, proofTitle); expect(shareUrl).toBeDefined(); }); + await test.step('Scan the QR code and create an account for all signers', async () => { - await Promise.all([signer1.goto(shareUrl)]); + await signer1.goto(shareUrl); - await Promise.all([ - spireKey.createSpireKeyAccountFor(signer1, 'signer1', true), - ]); + const popupPromise = signer1.waitForEvent('popup'); + await proofOfusApp.loginToMintWithSigner(signer1); - await Promise.all([signer1.goto(shareUrl)]); + const signerPopup = await popupPromise; + signerCredential = await spirekeyApp.createSpireKeyAccountFor( + signerPopup, + true, + ); }); - // await test.step('Disable Signing for Signer 3', async () => { - // await proofOfUs.disableSigningFor(initiator, 'signer4'); - // }); + await test.step('Initiate the Signing Process with Initiator', async () => { - await proofOfUs.startSigningProcessWith(initiator); + await proofOfusApp.startSigningProcessWith(initiator); }); - await test.step('Sign the Proof with the Signers', async () => { - await Promise.all([proofOfUs.signProofWith(signer1)]); - await Promise.all([spireKey.signTransaction(signer1)]); - }); - await test.step('Upload the Proof with the Initiator', async () => { - // Start waiting for request before clicking. Note no await. - await proofOfUs.uploadProofWith(initiator); + await test.step('Sign with the Signer', async () => { + const popupPromise = signer1.waitForEvent('popup'); - const requestPromise = initiator.waitForRequest( - '**/chain/1/pact/api/v1/poll', - ); + await proofOfusApp.signProofWith(signer1); + const signerPopup = await popupPromise; + await spirekeyApp.signTransaction(signerPopup, signerCredential); + }); - await spireKey.signTransaction(initiator); - const postData = (await requestPromise).postData(); - console.log(postData); + await test.step('Sign with Initiator & Mint NFT', async () => { + const popupPromise = initiator.waitForEvent('popup'); + await proofOfusApp.signAndMintWith(initiator); + const initiatorPopup = await popupPromise; + await spirekeyApp.signTransaction(initiatorPopup, initiatorCredential); }); + await test.step('The Proof should be succesfully minted for the initiator as well as all the signers', async () => { await Promise.all([ expect(initiator.getByRole('heading', { name: proofTitle })).toBeVisible({ @@ -62,64 +71,92 @@ test('1 Initiator, 1 signers. all participants sign -> Should be able to mint th }), ]); }); + + await test.step('DEBUG: log link to block explorer', async () => { + await proofOfusApp.logBlockExplorerUrl(initiator); + }); }); -test('1 Initiator, 2 signers. all participants sign -> Should be able to mint the connection token @s', async ({ +test('1 Initiator, 2 signers. all participants sign -> Should be able to mint the connection token @xs', async ({ initiator, signer1, signer2, + spirekeyApp, + proofOfusApp, }) => { - await test.step('Create account in SpireKey and initiate a connection in Proof of Us.', async () => { - await initiator.goto('https://proof-of-agao4ohsw-kadena-js.vercel.app/'); - // Initiator: Create a SpireKey account - await initiator.getByRole('button', { name: 'Login to mint' }).click(); - await spireKey.createSpireKeyAccountFor(initiator, 'initiator'); - shareUrl = await proofOfUs.createProofWith(initiator, proofTitle); + await test.step('Create an account for the initiator and create proof', async () => { + await initiator.goto(TESTURL); + const popupPromise = initiator.waitForEvent('popup'); + await proofOfusApp.loginToMintWith(initiator); + const initiatorPopup = await popupPromise; + initiatorCredential = await spirekeyApp.createSpireKeyAccountFor( + initiatorPopup, + true, + ); + + shareUrl = await proofOfusApp.createProofWith(initiator, proofTitle); expect(shareUrl).toBeDefined(); }); - await test.step('Scan the QR code and create an account for all signers', async () => { - await Promise.all([signer1.goto(shareUrl), signer2.goto(shareUrl)]); + await test.step('Scan the QR code and create an account for all signers', async () => { await Promise.all([ - spireKey.createSpireKeyAccountFor(signer1, 'signer1', true), - spireKey.createSpireKeyAccountFor(signer2, 'signer2', true), - ]); + (async () => { + await signer1.goto(shareUrl); - await Promise.all([signer1.goto(shareUrl), signer2.goto(shareUrl)]); - }); + const popupPromise = signer1.waitForEvent('popup'); + await proofOfusApp.loginToMintWithSigner(signer1); - await test.step('wait for all siners to be in the list', async () => { - await proofOfUs.countallSigners(initiator, 2); + const signerPopup = await popupPromise; + signerCredential = await spirekeyApp.createSpireKeyAccountFor( + signerPopup, + true, + ); + })(), + (async () => { + await signer2.goto(shareUrl); + + const popupPromise = signer2.waitForEvent('popup'); + await proofOfusApp.loginToMintWithSigner(signer2); + + const signerPopup = await popupPromise; + signer2Credential = await spirekeyApp.createSpireKeyAccountFor( + signerPopup, + true, + ); + })(), + ]); }); - // await test.step('Disable Signing for Signer 3', async () => { - // await proofOfUs.disableSigningFor(initiator, 'signer4'); - // }); await test.step('Initiate the Signing Process with Initiator', async () => { - await proofOfUs.startSigningProcessWith(initiator); + await proofOfusApp.startSigningProcessWith(initiator); }); - await test.step('Sign the Proof with the Signers', async () => { - await Promise.all([ - proofOfUs.signProofWith(signer1), - proofOfUs.signProofWith(signer2), - ]); + await test.step('Sign with the Signer', async () => { await Promise.all([ - spireKey.signTransaction(signer1), - spireKey.signTransaction(signer2), + (async () => { + const popupPromise = signer1.waitForEvent('popup'); + + await proofOfusApp.signProofWith(signer1); + const signerPopup = await popupPromise; + await spirekeyApp.signTransaction(signerPopup, signerCredential); + })(), + (async () => { + const popupPromise = signer2.waitForEvent('popup'); + + await proofOfusApp.signProofWith(signer2); + const signerPopup = await popupPromise; + await spirekeyApp.signTransaction(signerPopup, signer2Credential); + })(), ]); }); - await test.step('Upload the Proof with the Initiator', async () => { - // Start waiting for request before clicking. Note no await. - await proofOfUs.uploadProofWith(initiator); - const requestPromise = initiator.waitForRequest( - '**/chain/1/pact/api/v1/poll', - ); - await spireKey.signTransaction(initiator); - const postData = (await requestPromise).postData(); - console.log(postData); + await test.step('Sign with Initiator & Mint NFT', async () => { + const popupPromise = initiator.waitForEvent('popup'); + await proofOfusApp.signAndMintWith(initiator); + const initiatorPopup = await popupPromise; + await spirekeyApp.signTransaction(initiatorPopup, initiatorCredential); }); + await test.step('The Proof should be succesfully minted for the initiator as well as all the signers', async () => { await Promise.all([ expect(initiator.getByRole('heading', { name: proofTitle })).toBeVisible({ @@ -133,4 +170,8 @@ test('1 Initiator, 2 signers. all participants sign -> Should be able to mint th }), ]); }); + + await test.step('DEBUG: log link to block explorer', async () => { + await proofOfusApp.logBlockExplorerUrl(initiator); + }); }); diff --git a/packages/e2e/e2e-tools/package.json b/packages/e2e/e2e-tools/package.json index 607db46603..c8cef1b61c 100644 --- a/packages/e2e/e2e-tools/package.json +++ b/packages/e2e/e2e-tools/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "@kadena/tools": "workspace:*", - "@playwright/test": "^1.44.0" + "@playwright/test": "^1.45.3" }, "devDependencies": { "@kadena-dev/e2e-base": "workspace:*", @@ -30,7 +30,7 @@ "@types/node": "^20.12.7", "eslint": "^8.45.0", "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-playwright": "1.6.1", + "eslint-plugin-playwright": "1.6.2", "playwright-i18next-fixture": "^1.0.0", "prettier": "~3.2.5" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80d8ae3c42..416d34bd66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,7 +197,7 @@ importers: dependencies: next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -297,10 +297,10 @@ importers: version: 6.9.1 next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -400,7 +400,7 @@ importers: version: 0.4.14 '@vanilla-extract/next-plugin': specifier: 2.4.0 - version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.3.107(@swc/helpers@0.5.11))) + version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.3.107(@swc/helpers@0.5.11))) '@vanilla-extract/vite-plugin': specifier: 4.0.7 version: 4.0.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)) @@ -454,7 +454,7 @@ importers: version: 1.0.1 next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) octokit: specifier: ^3.2.1 version: 3.2.1 @@ -520,7 +520,7 @@ importers: version: 2.4.1 '@sentry/nextjs': specifier: ^8 - version: 8.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.88.2) + version: 8.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.88.2) '@vanilla-extract/dynamic': specifier: ^2.1.2 version: 2.1.2 @@ -541,7 +541,7 @@ importers: version: 3.0.5 next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -608,7 +608,7 @@ importers: version: 1.14.2 '@vanilla-extract/next-plugin': specifier: 2.4.0 - version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2) + version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2) '@vitejs/plugin-react': specifier: ^4.3.1 version: 4.3.1(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)) @@ -623,7 +623,7 @@ importers: version: 8.2.2 next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -819,7 +819,7 @@ importers: version: 5.16.0(graphql@16.8.2) next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -868,7 +868,7 @@ importers: version: 1.14.2 '@vanilla-extract/next-plugin': specifier: 2.4.0 - version: 2.4.0(@types/node@20.14.9)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.88.2) + version: 2.4.0(@types/node@20.14.9)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.88.2) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -913,10 +913,10 @@ importers: version: 3.5.1 next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -971,7 +971,7 @@ importers: version: 1.14.2 '@vanilla-extract/next-plugin': specifier: 2.4.0 - version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) + version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) '@vanilla-extract/vite-plugin': specifier: 4.0.7 version: 4.0.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)) @@ -992,7 +992,7 @@ importers: version: 12.10.3 next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) node-cron: specifier: ^3.0.3 version: 3.0.3 @@ -1032,6 +1032,9 @@ importers: '@kadena/pactjs': specifier: workspace:* version: link:../../libs/pactjs + '@kadena/spirekey-sdk': + specifier: 0.0.1-dev-12 + version: 0.0.1-dev-12 '@pinata/sdk': specifier: ^2.1.0 version: 2.1.0 @@ -1070,10 +1073,10 @@ importers: version: 2.0.6(@types/express@4.17.21) next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1143,7 +1146,7 @@ importers: version: 9.0.8 '@vanilla-extract/next-plugin': specifier: 2.4.0 - version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) + version: 2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) '@vanilla-extract/vite-plugin': specifier: 4.0.7 version: 4.0.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)) @@ -1185,7 +1188,7 @@ importers: version: 2.7.6(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1285,13 +1288,13 @@ importers: version: 3.0.5 next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-translate: specifier: ~2.0.6 - version: 2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1367,7 +1370,7 @@ importers: version: 18.3.0 '@vanilla-extract/next-plugin': specifier: 2.1.2 - version: 2.1.2(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2) + version: 2.1.2(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2) '@vanilla-extract/vite-plugin': specifier: 4.0.7 version: 4.0.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(vite@5.3.3(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)) @@ -1382,7 +1385,7 @@ importers: version: 2.8.6 '@webpro/next-translate-plugin': specifier: ^2.6.3 - version: 2.6.3(next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)) + version: 2.6.3(next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)) debug: specifier: 4.3.4 version: 4.3.4(supports-color@5.5.0) @@ -1400,7 +1403,7 @@ importers: version: 12.10.3 next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1457,8 +1460,8 @@ importers: specifier: workspace:* version: link:../../libs/types '@playwright/test': - specifier: ^1.44.0 - version: 1.45.1 + specifier: ^1.45.3 + version: 1.46.1 '@rushstack/eslint-config': specifier: ~3.6.9 version: 3.6.10(eslint@8.57.0)(typescript@5.4.5) @@ -1472,8 +1475,8 @@ importers: specifier: ^8.45.0 version: 8.57.0 eslint-plugin-playwright: - specifier: 1.6.1 - version: 1.6.1(eslint@8.57.0) + specifier: 1.6.2 + version: 1.6.2(eslint@8.57.0) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1484,8 +1487,8 @@ importers: specifier: workspace:* version: link:../../apps/docs '@playwright/test': - specifier: ^1.44.0 - version: 1.45.1 + specifier: ^1.45.3 + version: 1.46.1 devDependencies: '@kadena-dev/e2e-base': specifier: workspace:* @@ -1518,8 +1521,8 @@ importers: specifier: ^8.45.0 version: 8.57.0 eslint-plugin-playwright: - specifier: 1.6.1 - version: 1.6.1(eslint@8.57.0) + specifier: 1.6.2 + version: 1.6.2(eslint@8.57.0) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1570,8 +1573,8 @@ importers: specifier: workspace:* version: link:../../libs/types '@playwright/test': - specifier: ^1.44.0 - version: 1.45.1 + specifier: ^1.45.3 + version: 1.46.1 '@rushstack/eslint-config': specifier: ~3.6.9 version: 3.6.10(eslint@8.57.0)(typescript@5.4.5) @@ -1588,8 +1591,8 @@ importers: specifier: 3.5.5 version: 3.5.5(eslint-plugin-import@2.27.5)(eslint@8.57.0) eslint-plugin-playwright: - specifier: 1.6.1 - version: 1.6.1(eslint@8.57.0) + specifier: 1.6.2 + version: 1.6.2(eslint@8.57.0) graphql-ws: specifier: ^5.16.0 version: 5.16.0(graphql@16.8.2) @@ -1598,7 +1601,7 @@ importers: version: 2.0.5 playwright-i18next-fixture: specifier: ^1.0.0 - version: 1.0.0(@playwright/test@1.45.1) + version: 1.0.0(@playwright/test@1.46.1) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1612,8 +1615,8 @@ importers: specifier: workspace:* version: link:../../apps/tools '@playwright/test': - specifier: ^1.44.0 - version: 1.45.1 + specifier: ^1.45.3 + version: 1.46.1 devDependencies: '@kadena-dev/e2e-base': specifier: workspace:* @@ -1649,8 +1652,8 @@ importers: specifier: 3.5.5 version: 3.5.5(eslint-plugin-import@2.27.5)(eslint@8.57.0) eslint-plugin-playwright: - specifier: 1.6.1 - version: 1.6.1(eslint@8.57.0) + specifier: 1.6.2 + version: 1.6.2(eslint@8.57.0) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -1661,8 +1664,8 @@ importers: specifier: workspace:* version: link:../../apps/tools '@playwright/test': - specifier: ^1.44.0 - version: 1.45.1 + specifier: ^1.45.3 + version: 1.46.1 devDependencies: '@kadena-dev/e2e-base': specifier: workspace:* @@ -1698,11 +1701,11 @@ importers: specifier: 3.5.5 version: 3.5.5(eslint-plugin-import@2.27.5)(eslint@8.57.0) eslint-plugin-playwright: - specifier: 1.6.1 - version: 1.6.1(eslint@8.57.0) + specifier: 1.6.2 + version: 1.6.2(eslint@8.57.0) playwright-i18next-fixture: specifier: ^1.0.0 - version: 1.0.0(@playwright/test@1.45.1) + version: 1.0.0(@playwright/test@1.46.1) prettier: specifier: ~3.2.5 version: 3.2.5 @@ -6435,8 +6438,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.45.1': - resolution: {integrity: sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==} + '@playwright/test@1.46.1': + resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==} engines: {node: '>=18'} hasBin: true @@ -11891,8 +11894,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - eslint-plugin-playwright@1.6.1: - resolution: {integrity: sha512-pfcaeAENH0jZEuUxynfVgMlLY9CSp68D9Ja2z32Xq5zhWCN1HoixSHOzhYVuh/N6fYwtBp4kLu/+IIUTXBTGZg==} + eslint-plugin-playwright@1.6.2: + resolution: {integrity: sha512-mraN4Em3b5jLt01q7qWPyLg0Q5v3KAWfJSlEWwldyUXoa7DSPrBR4k6B6LROLqipsG8ndkwWMdjl1Ffdh15tag==} engines: {node: '>=16.6.0'} peerDependencies: eslint: '>=8.40.0' @@ -15611,8 +15614,8 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} - playwright-core@1.45.1: - resolution: {integrity: sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==} + playwright-core@1.46.1: + resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} engines: {node: '>=18'} hasBin: true @@ -15621,8 +15624,8 @@ packages: peerDependencies: '@playwright/test': ^1.26.0 - playwright@1.45.1: - resolution: {integrity: sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==} + playwright@1.46.1: + resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} engines: {node: '>=18'} hasBin: true @@ -23471,9 +23474,9 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.45.1': + '@playwright/test@1.46.1': dependencies: - playwright: 1.45.1 + playwright: 1.46.1 '@pnpm/constants@7.1.1': {} @@ -25545,7 +25548,7 @@ snapshots: '@sentry/types': 8.15.0 '@sentry/utils': 8.15.0 - '@sentry/nextjs@8.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.88.2)': + '@sentry/nextjs@8.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.88.2)': dependencies: '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0) '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.4) @@ -25558,7 +25561,7 @@ snapshots: '@sentry/vercel-edge': 8.15.0 '@sentry/webpack-plugin': 2.20.1(webpack@5.88.2) chalk: 3.0.0 - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resolve: 1.22.8 rollup: 3.29.4 stacktrace-parser: 0.1.10 @@ -27984,11 +27987,11 @@ snapshots: - supports-color - terser - '@vanilla-extract/next-plugin@2.1.2(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2)': + '@vanilla-extract/next-plugin@2.1.2(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2)': dependencies: '@vanilla-extract/webpack-plugin': 2.3.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(webpack@5.88.2) browserslist: 4.23.1 - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28001,10 +28004,10 @@ snapshots: - terser - webpack - '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.3.107(@swc/helpers@0.5.11)))': + '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.3.107(@swc/helpers@0.5.11)))': dependencies: '@vanilla-extract/webpack-plugin': 2.3.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(webpack@5.88.2(@swc/core@1.3.107(@swc/helpers@0.5.11))) - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28017,10 +28020,10 @@ snapshots: - terser - webpack - '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2)': + '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2)': dependencies: '@vanilla-extract/webpack-plugin': 2.3.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(webpack@5.88.2) - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28033,10 +28036,10 @@ snapshots: - terser - webpack - '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11)))': + '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(lightningcss@1.25.1)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11)))': dependencies: '@vanilla-extract/webpack-plugin': 2.3.7(@types/node@20.14.9)(lightningcss@1.25.1)(terser@5.31.1)(webpack@5.88.2(@swc/core@1.6.7(@swc/helpers@0.5.11))) - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28049,10 +28052,10 @@ snapshots: - terser - webpack - '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.88.2)': + '@vanilla-extract/next-plugin@2.4.0(@types/node@20.14.9)(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.88.2)': dependencies: '@vanilla-extract/webpack-plugin': 2.3.7(@types/node@20.14.9)(webpack@5.88.2) - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28696,9 +28699,9 @@ snapshots: dependencies: webpack-cli: 4.10.0(webpack@5.88.2) - '@webpro/next-translate-plugin@2.6.3(next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))': + '@webpro/next-translate-plugin@2.6.3(next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))': dependencies: - next-translate: 2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + next-translate: 2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) typescript: 4.5.2 '@whatwg-node/events@0.0.3': {} @@ -31249,7 +31252,7 @@ snapshots: object.fromentries: 2.0.8 semver: 6.3.1 - eslint-plugin-playwright@1.6.1(eslint@8.57.0): + eslint-plugin-playwright@1.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 globals: 13.24.0 @@ -35259,23 +35262,23 @@ snapshots: dependencies: js-yaml-loader: 1.2.2 - next-router-mock@0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-router-mock@0.9.13(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next-themes@0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-translate@2.0.6(next@14.2.2(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.2(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.46.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.2 '@swc/helpers': 0.5.5 @@ -35297,7 +35300,7 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.2 '@next/swc-win32-x64-msvc': 14.2.2 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.1 + '@playwright/test': 1.46.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -36040,16 +36043,16 @@ snapshots: dependencies: find-up: 3.0.0 - playwright-core@1.45.1: {} + playwright-core@1.46.1: {} - playwright-i18next-fixture@1.0.0(@playwright/test@1.45.1): + playwright-i18next-fixture@1.0.0(@playwright/test@1.46.1): dependencies: - '@playwright/test': 1.45.1 + '@playwright/test': 1.46.1 i18next: 21.10.0 - playwright@1.45.1: + playwright@1.46.1: dependencies: - playwright-core: 1.45.1 + playwright-core: 1.46.1 optionalDependencies: fsevents: 2.3.2