diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml new file mode 100644 index 00000000..fa0163dd --- /dev/null +++ b/.github/workflows/test-e2e.yml @@ -0,0 +1,81 @@ +name: UI E2E Tests + +on: + - pull_request + +jobs: + e2e-tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.6.0 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + + - name: Run local node + working-directory: docker + run: docker compose -p dev up -d --build + env: + PROJECT: bako-id + MIN_GAS_PRICE: 1 + WALLET_SECRET: # secret + DISPENSE_AMOUNT: 2000000 + FUEL_CORE_PORT: 4000 + FUEL_FAUCET_PORT: 4040 + FUEL_IP: 0.0.0.0 + + - name: Deploy contracts + working-directory: packages/contracts + run: pnpm exec ts-node scripts/deploy.ts + env: + PROVIDER_URL: http://localhost:4000/v1/graphql + PRIVATE_KEY: # secret + RECIPIENT_ADDRESS: # secret + + - name: Start contracts + working-directory: packages/contracts + run: pnpm exec ts-node scripts/construct-contracts.ts + env: + PROVIDER_URL: http://localhost:4000/v1/graphql + PRIVATE_KEY: # secret + RECIPIENT_ADDRESS: # secret + + - name: Copy server .env.test to .env + working-directory: apps/server + run: cp .env.test .env + + - name: Copy ui .env.test to .env + working-directory: apps/ui + run: cp .env.test .env + + - name: Copy e2e-tests .env.example to .env + working-directory: packages/e2e-tests + run: cp .env.example .env + + - name: Install Playwright + working-directory: packages/e2e-tests + run: pnpm exec playwright install --with-deps chromium + + - name: Run Playwright tests + run: pnpm run test:e2e + env: + TEST_WALLET_PRIVATE_KEY: # secret + + - name: Upload report to GitHub Actions Artifacts + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/apps/server/.env.test b/apps/server/.env.test new file mode 100644 index 00000000..8989f472 --- /dev/null +++ b/apps/server/.env.test @@ -0,0 +1 @@ +NEXT_PUBLIC_PROVIDER_URL=http://localhost:4000/v1/graphql diff --git a/apps/ui/.env.test b/apps/ui/.env.test new file mode 100644 index 00000000..aff56690 --- /dev/null +++ b/apps/ui/.env.test @@ -0,0 +1,6 @@ +VITE_PROVIDER_URL=http://localhost:4000/v1/graphql +VITE_EXPLORER_URL=https://app.fuel.network +VITE_API_URL=http://localhost:3033/api +VITE_MARKETPLACE_URL=http://localhost:3002 +VITE_MARKETPLACE_UI_URL=http://marketplace.localhost:5173 +VITE_ENVIRONMENT=local diff --git a/apps/ui/.gitignore b/apps/ui/.gitignore index 123aa7d6..fd258966 100644 --- a/apps/ui/.gitignore +++ b/apps/ui/.gitignore @@ -26,10 +26,3 @@ dist-ssr routeTree.gen.ts .vercel - -# Playwright -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ -.cache \ No newline at end of file diff --git a/apps/ui/package.json b/apps/ui/package.json index b0c75b08..a7d1e525 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -7,8 +7,7 @@ "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "test:e2e": "playwright test" + "preview": "vite preview" }, "dependencies": { "@bako-id/contracts": "workspace:*", @@ -22,7 +21,7 @@ "@ensdomains/ensjs": "4.0.2", "@fuels/connectors": "0.44.0", "@fuels/react": "0.44.0", - "@tanstack/react-query": "^5.59.16", + "@tanstack/react-query": "5.59.16", "@tanstack/react-router": "^1.77.8", "@tanstack/router-devtools": "^1.77.8", "@wagmi/connectors": "5.1.7", @@ -47,12 +46,9 @@ "zustand": "^5.0.7" }, "devDependencies": { - "@fuels/playwright-utils": "^0.57.1", - "@playwright/test": "^1.53.1", "@tanstack/react-query-devtools": "^5.59.16", "@tanstack/router-vite-plugin": "^1.16.5", "@types/lodash": "^4.17.0", - "@types/node": "^24.0.3", "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@types/react-text-mask": "^5.4.14", diff --git a/apps/ui/playwright.config.ts b/apps/ui/playwright.config.ts deleted file mode 100644 index d1bb3d3e..00000000 --- a/apps/ui/playwright.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { defineConfig } from '@playwright/test'; - -export default defineConfig({ - globalSetup: './tests/ultils/global-setup.ts', - testDir: './tests', - fullyParallel: true, - retries: process.env.CI ? 2 : 0, - workers: process.env.CI ? 2 : 1, - timeout: 150000, - expect: { - timeout: 8000, - }, - reporter: 'blob', - use: { - headless: true, - screenshot: 'only-on-failure', - trace: process.env.CI ? 'on-first-retry' : 'retain-on-failure', - baseURL: 'https://preview.bako.id/', - permissions: ['clipboard-read', 'clipboard-write'], - }, -}); diff --git a/apps/ui/src/main.tsx b/apps/ui/src/main.tsx index 337b1d1a..d9491576 100644 --- a/apps/ui/src/main.tsx +++ b/apps/ui/src/main.tsx @@ -69,6 +69,14 @@ if (isPreview || !shouldRenderMarketplace() || import.meta.env.DEV) { }); } +const isLocal = import.meta.env.VITE_ENVIRONMENT === 'local'; +if (isLocal) { + BASE_NETWORK_CONFIGS.push({ + chainId: CHAIN_IDS.fuel.devnet, + url: 'http://localhost:4000/v1/graphql', + }); +} + ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/apps/ui/src/modules/marketplace/components/mintPanel/mintSuccess.tsx b/apps/ui/src/modules/marketplace/components/mintPanel/mintSuccess.tsx index fa82a756..9d6ae87b 100644 --- a/apps/ui/src/modules/marketplace/components/mintPanel/mintSuccess.tsx +++ b/apps/ui/src/modules/marketplace/components/mintPanel/mintSuccess.tsx @@ -69,7 +69,13 @@ export default function MintSuccess({ objectPosition="center" maxH="116px" /> - + @@ -136,7 +142,7 @@ export default function MintSuccess({ onClick={() => window.open( `${explorerUrl}/tx/${transactionId}`, - '_blank' + '_blank', ) } > @@ -169,7 +175,10 @@ export default function MintSuccess({ const CustomNavigation = ({ swiper, showGradient, -}: { swiper: SwiperType | null; showGradient: boolean }) => { +}: { + swiper: SwiperType | null; + showGradient: boolean; +}) => { const [isBeginning, setIsBeginning] = useState(true); const [isEnd, setIsEnd] = useState(false); diff --git a/apps/ui/src/modules/profile/components/nft/NftSaleCard.tsx b/apps/ui/src/modules/profile/components/nft/NftSaleCard.tsx index 6794c7aa..ea2645b5 100644 --- a/apps/ui/src/modules/profile/components/nft/NftSaleCard.tsx +++ b/apps/ui/src/modules/profile/components/nft/NftSaleCard.tsx @@ -64,7 +64,7 @@ const NftSaleCard = ({ const { executeOrderAsync, isPending: isExecuting } = useExecuteOrder( collection?.data?.id ?? '', - setTxId + setTxId, ); const showDisplayBuyButton = displayBuyButton || isExecuting; @@ -102,7 +102,7 @@ const NftSaleCard = ({ successToast, errorToast, isConnected, - ] + ], ); const handleOpenDialog = () => { @@ -156,11 +156,14 @@ const NftSaleCard = ({ style: 'currency', currency: 'USD', }).format(Number(order.price.usd)), - [order.price.usd] + [order.price.usd], ); const orderPrice = useMemo( - () => typeof order.price.amount === 'string' ? order.price.amount : orderPriceFormatter(order.price.amount), - [order.price.amount] + () => + typeof order.price.amount === 'string' + ? order.price.amount + : orderPriceFormatter(order.price.amount), + [order.price.amount], ); const assetSymbolUrl = order.price.image || UnknownAsset; @@ -170,7 +173,7 @@ const NftSaleCard = ({ const isProcessigNewPrices = useMemo(() => { const hasOrderUpdated = updatedOrders.find( - (updatedOrder) => updatedOrder.orderId === order.id + (updatedOrder) => updatedOrder.orderId === order.id, ); return ( hasOrderUpdated && @@ -189,6 +192,7 @@ const NftSaleCard = ({ } onMouseLeave={() => setDisplayBuyButton(false)} position="relative" + data-testid="nft-sale-card" > diff --git a/apps/ui/src/routeTree.gen.ts b/apps/ui/src/routeTree.gen.ts index 388f3434..d9b0e2be 100644 --- a/apps/ui/src/routeTree.gen.ts +++ b/apps/ui/src/routeTree.gen.ts @@ -7,3 +7,29 @@ // This file was automatically generated by TanStack Router. // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' + +export interface FileRoutesByFullPath {} +export interface FileRoutesByTo {} +export interface FileRoutesById { + __root__: typeof rootRouteImport +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: never + fileRoutesByTo: FileRoutesByTo + to: never + id: '__root__' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren {} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath {} +} + +const rootRouteChildren: RootRouteChildren = {} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/apps/ui/tests/bako-id/bako.test.ts b/apps/ui/tests/bako-id/bako.test.ts deleted file mode 100644 index 094bfe66..00000000 --- a/apps/ui/tests/bako-id/bako.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { AuthTestService } from '../ultils/service/auth-service'; -import { getVaultAddress, transfer } from '../ultils/helpers'; -import { Provider, Wallet } from 'fuels'; -import { NewHandleService } from '../ultils/service/new-handle'; - -test.describe('Connect with Bako Safe', () => { - test.fixme('create new bako user', async ({ context }) => { - const bakoIdPage = await context.newPage(); - const bakoSafePage = await context.newPage(); - await bakoIdPage.goto('/'); - - await test.step('connect in Bako', async () => { - await expect(bakoIdPage.getByText('Search new Handle')).toBeVisible(); - await bakoIdPage.getByRole('button', { name: 'Connect Wallet' }).click(); - await bakoIdPage.getByLabel('Connect to Bako Safe').click(); - const popup = await bakoIdPage.waitForEvent('popup'); - await AuthTestService.loginAuth(popup); - - await expect( - bakoIdPage.getByRole('button', { name: 'My Handles' }), - ).toBeVisible(); - - await bakoSafePage.goto('https://safe.bako.global/home'); - }); - - const newHandle = `automation${Date.now()}`; - console.log('new handle: ', newHandle); - - await test.step('create new handle', async () => { - await bakoIdPage - .getByRole('textbox', { name: 'Search for an available Handle' }) - .fill(newHandle); - await bakoIdPage.waitForTimeout(3000); - await bakoIdPage - .getByRole('button', { - name: 'Continue', - }) - .click(); - - await expect(bakoIdPage.getByText(newHandle)).toBeVisible({ - timeout: 10000, - }); - await expect(bakoIdPage.getByText('Handles0.001 ETH')).toBeVisible(); - - const vaultAddress = await getVaultAddress(bakoSafePage); - - const { value } = await NewHandleService.getValueNewHandle(bakoIdPage); - - const provider = new Provider('http://testnet.fuel.network/v1/graphql'); - const genesisWallet = Wallet.fromPrivateKey( - '0x5ac4a3075cfeb0a1238efc082978aa6a7a2efe11e6f2ce2b564d708807fab6ad', - provider, - ); - await transfer(genesisWallet, value, vaultAddress); - - await bakoIdPage - .getByRole('button', { name: 'Confirm Transaction' }) - .click(); - await bakoIdPage - .getByLabel('Bako ID Terms Of Use Agreement') - .locator('div') - .filter({ hasText: '1. The Bako IDThe “Bako ID”' }) - .nth(2) - .evaluate((el) => { - el.scrollTop = el.scrollHeight; - }); - const client = await bakoSafePage.context().newCDPSession(bakoSafePage); - await client.send('WebAuthn.enable'); - await client.send('WebAuthn.addVirtualAuthenticator', { - options: { - protocol: 'ctap2', - transport: 'internal', - hasResidentKey: true, - hasUserVerification: true, - isUserVerified: true, - automaticPresenceSimulation: true, - }, - }); - await bakoIdPage.getByRole('button', { name: 'Accept' }).click(); - }); - }); -}); diff --git a/apps/ui/tests/garage/garage.test.ts b/apps/ui/tests/garage/garage.test.ts deleted file mode 100644 index 5bbd3822..00000000 --- a/apps/ui/tests/garage/garage.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { FuelWalletTestHelper, test } from '@fuels/playwright-utils'; -import { E2ETestUtils } from '../ultils/setup'; -import { WalletUnlocked } from 'fuels'; -import { returnFundsToGenesisWallet, transfer } from '../ultils/helpers'; - -await E2ETestUtils.downloadFuelExtension({ test }); - -test.describe('Connect with fuel wallet', () => { - let fuelWalletTestHelper: FuelWalletTestHelper; - let genesisWallet: WalletUnlocked; - - test.beforeEach(async ({ extensionId, context, page }) => { - const E2EUtils = await E2ETestUtils.setupFuelWallet({ - page, - context, - extensionId, - }); - - fuelWalletTestHelper = E2EUtils.fuelWalletTestHelper; - genesisWallet = E2EUtils.genesisWallet; - }); - - test.afterEach(async ({ extensionId, context }) => { - const genesisAddress = genesisWallet.address.toString(); - - await returnFundsToGenesisWallet({ - context, - extensionId, - genesisAddress, - }); - }); - - test('mint 1 NFT', async ({ page }) => { - await page.goto('https://preview.garage.zone/'); - await page.getByRole('button', { name: 'Connect Wallet' }).dblclick(); - await page.getByLabel('Connect to Fuel Wallet').click(); - await fuelWalletTestHelper.walletConnect(); - await page.locator('[id^="menu-button"]').click(); - await page.getByRole('menuitem').nth(1).click(); - - const connectedAddress = await page.evaluate(() => - navigator.clipboard.readText(), - ); - const value = 0.000005; - - await transfer(genesisWallet, value, connectedAddress); - - await page.getByRole('heading', { name: 'Thermal Punks' }).click(); - await page.getByRole('button', { name: 'Mint 1 NFT' }).click(); - - await E2ETestUtils.signMessageFuelWallet({ - fuelWalletTestHelper, - page, - }); - }); - - test('mint 2 NFT', async ({ page }) => { - await page.goto('https://preview.garage.zone/'); - await page.getByRole('button', { name: 'Connect Wallet' }).dblclick(); - await page.getByLabel('Connect to Fuel Wallet').click(); - await fuelWalletTestHelper.walletConnect(); - await page.locator('[id^="menu-button"]').click(); - await page.getByRole('menuitem').nth(1).click(); - - const connectedAddress = await page.evaluate(() => - navigator.clipboard.readText(), - ); - const value = 0.000005; - - await transfer(genesisWallet, value, connectedAddress); - - await page.getByRole('heading', { name: 'Thermal Punks' }).click(); - await page.getByRole('button', { name: 'Mint 2 NFTs' }).click(); - - await E2ETestUtils.signMessageFuelWallet({ - fuelWalletTestHelper, - page, - }); - }); -}); diff --git a/apps/ui/tests/ultils/service/auth-service.ts b/apps/ui/tests/ultils/service/auth-service.ts deleted file mode 100644 index efc138fb..00000000 --- a/apps/ui/tests/ultils/service/auth-service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { getByAriaLabel } from '@fuels/playwright-utils'; -import { Page } from '@playwright/test'; -import { WalletUnlocked } from 'fuels'; - -import { E2ETestUtils } from '../setup'; - -interface LoginAuthTestResponse { - username: string; - genesisWallet: WalletUnlocked; -} - -export class AuthTestService { - static async loginAuth( - page: Page, - wallet: WalletUnlocked | null = null, - ): Promise { - if (!wallet) { - const { genesisWallet } = await E2ETestUtils.setupPasskey({ page }); - wallet = genesisWallet; - } - - const usernameInput = page.locator('#fixed_id'); - const name = `teste${Date.now()}`; - await usernameInput.fill(name); - - await page.waitForTimeout(1000); - await getByAriaLabel(page, 'Create account') - .filter({ has: page.locator(':visible') }) - .click(); - - const termsOfUseDialog = await page.$('[aria-label="Terms of Use"]'); - if (termsOfUseDialog) { - await termsOfUseDialog.evaluate((element) => { - element.scrollTop = element.scrollHeight; - }); - } - - await getByAriaLabel(page, 'Accept Terms of Use').click(); - await getByAriaLabel(page, 'Begin') - .filter({ has: page.locator(':visible') }) - .click(); - await page.waitForTimeout(1000); - - return { username: name, genesisWallet: wallet }; - } -} diff --git a/apps/ui/tests/ultils/service/new-handle.ts b/apps/ui/tests/ultils/service/new-handle.ts deleted file mode 100644 index a5b581ad..00000000 --- a/apps/ui/tests/ultils/service/new-handle.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { FuelWalletTestHelper } from '@fuels/playwright-utils'; -import { Page } from '@playwright/test'; - -export class NewHandleService { - static async getValueNewHandle(page: Page) { - await page.locator('text=Estimated total').waitFor({ state: 'visible' }); - const estimatedTotal = await page.evaluate(() => { - return ( - document - .querySelector( - 'div.chakra-stack.css-10t90fk p.chakra-text.css-io0ltg:nth-of-type(2)', - ) - ?.textContent?.trim() ?? '' - ); - }); - const rawValue = parseFloat(estimatedTotal.replace('ETH', '').trim()); - const value = rawValue + 0.0000002; - - return value; - } - - static async getValueEditProfile( - fuelWalletTestHelper: FuelWalletTestHelper, - page: Page, - ) { - let popupPage: Page; - try { - popupPage = await fuelWalletTestHelper.getWalletPopupPage(); - } catch { - await page.getByRole('button', { name: 'Save changes' }).click(); - await page.getByRole('button', { name: 'Confirm' }).click(); - - popupPage = await fuelWalletTestHelper.getWalletPopupPage(); - } - - const estimatedTotal = parseFloat( - (await popupPage.locator('p[aria-label="fee value:Regular"]').innerText()) - .replace('ETH', '') - .trim(), - ); - - const value = estimatedTotal + 0.0000002; - - return value; - } -} diff --git a/biome.json b/biome.json index 8cd13c3c..59141c0b 100644 --- a/biome.json +++ b/biome.json @@ -12,6 +12,7 @@ }, "linter": { "enabled": true, + "ignore": ["scripts/**"], "rules": { "recommended": true, "correctness": { @@ -49,7 +50,6 @@ "ignore": [ ".vscode", ".idea", - "scripts/**", "node_modules/**", ".turbo/**", "build/**", diff --git a/docker/fuel-core/Dockerfile b/docker/fuel-core/Dockerfile index e077efc5..e6cae516 100644 --- a/docker/fuel-core/Dockerfile +++ b/docker/fuel-core/Dockerfile @@ -6,7 +6,7 @@ # We should be supporting always the same fuel-core version as the fuels (ts-sdk) # https://github.com/FuelLabs/fuels-ts/blob/master/internal/fuel-core/VERSION -FROM ghcr.io/fuellabs/fuel-core:v0.40.0 +FROM ghcr.io/fuellabs/fuel-core:v0.44.0 # dependencies ENV DEBIAN_FRONTEND=noninteractive diff --git a/package.json b/package.json index 4a602fb3..6dac29b5 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "build:ui": "turbo run build --filter=@bako-id/ui", "build:doc": "turbo run docs:build", "test": "turbo run test --filter='./packages/*'", + "test:e2e": "turbo run test:e2e", "node:up": "make -C ./docker up", "node:down": "make -C ./docker down", "node:clean": "make -C ./docker clean" diff --git a/packages/contracts/package.json b/packages/contracts/package.json index aad1811b..0eb2e218 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -17,7 +17,8 @@ "test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --runInBand --silent", "build": "tsup", "build:sway": "pnpm fuels build", - "contracts:start": "ts-node scripts/construct-contracts.ts" + "contracts:start": "dotenv -e .env -- ts-node scripts/construct-contracts.ts", + "contracts:deploy": "dotenv -e .env -- ts-node scripts/deploy.ts" }, "keywords": [], "author": "", @@ -29,6 +30,7 @@ "@types/jest": "^29.5.11", "jest": "^29.6.4", "ts-jest": "^29.1.1", + "ts-node": "^10.9.2", "@shared/tsup": "workspace:*" } } diff --git a/packages/contracts/scripts/construct-contracts.ts b/packages/contracts/scripts/construct-contracts.ts index 7eeea15a..f85276ab 100644 --- a/packages/contracts/scripts/construct-contracts.ts +++ b/packages/contracts/scripts/construct-contracts.ts @@ -1,28 +1,19 @@ -import { getContractId, Manager, Nft, Registry, Resolver } from '../src'; +import { Manager, Nft, Registry, Resolver, getContractId } from '../src'; import { logger, setup } from './utils'; -const main = async () => { - const { provider, wallet } = await setup(); - - const managerId = getContractId(provider.url, 'manager'); - const resolverId = getContractId(provider.url, 'resolver'); - const registryId = getContractId(provider.url, 'registry'); - const nftId = getContractId(provider.url, 'nft'); - - const manager = new Manager(managerId, wallet); - const resolver = new Resolver(resolverId, wallet); - const registry = new Registry(registryId, wallet); +export const constructNft = async (wallet: any, registryId: string) => { + const nftId = getContractId(wallet.provider.url, 'nft'); const nft = new Nft(nftId, wallet); try { - const { value: nftOwner } = await manager.functions.owner().get(); + const { value: nftOwner } = await nft.functions.owner().get(); // @ts-ignore if (nftOwner === 'Uninitialized') { const nftConstruct = await nft.functions .constructor( { Address: { bits: wallet.address.toB256() } }, - { ContractId: { bits: registryId } }, + { ContractId: { bits: registryId } } ) .call(); await nftConstruct.waitForResult(); @@ -44,6 +35,13 @@ const main = async () => { } } + return nftId; +}; + +export const constructManager = async (wallet: any, registryId: string) => { + const managerId = getContractId(wallet.provider.url, 'manager'); + const manager = new Manager(managerId, wallet); + try { const { value: managerOwner } = await manager.functions.owner().get(); @@ -52,7 +50,7 @@ const main = async () => { const managerConstruct = await manager.functions .constructor( { Address: { bits: wallet.address.toB256() } }, - { ContractId: { bits: registryId } }, + { ContractId: { bits: registryId } } ) .call(); await managerConstruct.waitForResult(); @@ -74,6 +72,13 @@ const main = async () => { } } + return managerId; +}; + +export const constructResolver = async (wallet: any, managerId: string) => { + const resolverId = getContractId(wallet.provider.url, 'resolver'); + const resolver = new Resolver(resolverId, wallet); + try { const resolverConstruct = await resolver.functions .constructor({ bits: managerId }) @@ -88,12 +93,23 @@ const main = async () => { } } + return resolverId; +}; + +export const constructRegistry = async ( + wallet: any, + managerId: string, + nftId: string +) => { + const registryId = getContractId(wallet.provider.url, 'registry'); + const registry = new Registry(registryId, wallet); + try { const registryConstruct = await registry.functions .constructor( { bits: wallet.address.toB256() }, { bits: managerId }, - { bits: nftId }, + { bits: nftId } ) .call(); await registryConstruct.waitForResult(); @@ -105,6 +121,19 @@ const main = async () => { logger.error('Registry construct failed', e); } } + + return registryId; +}; + +const main = async () => { + const { provider, wallet } = await setup(); + + const registryId = getContractId(provider.url, 'registry'); + + const nftId = await constructNft(wallet, registryId); + const managerId = await constructManager(wallet, registryId); + await constructResolver(wallet, managerId); + await constructRegistry(wallet, managerId, nftId); }; main() diff --git a/packages/contracts/scripts/deploy.ts b/packages/contracts/scripts/deploy.ts new file mode 100644 index 00000000..1e3d409f --- /dev/null +++ b/packages/contracts/scripts/deploy.ts @@ -0,0 +1,143 @@ +import { + type Account, + type ContractFactory, + type Provider, + Src14OwnedProxy, + Src14OwnedProxyFactory, + ZeroBytes32, +} from 'fuels'; +import { + type Contracts, + ManagerFactory, + NftFactory, + RegistryFactory, + ResolverFactory, + getContractId, +} from '../src'; +import { logger, setContractId, setup } from './utils'; + +type DeployConfig = { + contract: { + name: Contracts; + factory: ContractFactory; + configurableConstants?: Record; + }; + provider: Provider; + wallet: Account; +}; + +const deployContractWithProxy = async (config: DeployConfig) => { + const { provider, wallet, contract } = config; + + logger.info(`[${contract.name}] Deploying new instance...`); + const { contractId, waitForResult: waitForDeploy } = + await contract.factory.deploy({ + configurableConstants: contract.configurableConstants, + }); + await waitForDeploy(); + + logger.info(`[${contract.name}] Checking has proxy instance...`); + const proxyAddress = getContractId(provider.url, contract.name); + const addressType = await provider.getAddressType( + proxyAddress ?? ZeroBytes32 + ); + const isDeployed = addressType === 'Contract'; + + if (!isDeployed) { + logger.info(`[${contract.name}] Deploying proxy...`); + const proxyDeployment = await Src14OwnedProxyFactory.deploy(wallet, { + configurableConstants: { + INITIAL_TARGET: { bits: contractId }, + INITIAL_OWNER: { + Initialized: { Address: { bits: wallet.address.toB256() } }, + }, + }, + }); + + const { contract: proxy } = await proxyDeployment.waitForResult(); + const { waitForResult } = await proxy.functions.initialize_proxy().call(); + await waitForResult(); + + logger.success( + `Proxy for ${contract.name} deployed! Id: ${proxy.id.toB256()} Target: ${contractId}` + ); + const proxyAddress = proxy.id.toB256(); + setContractId(provider.url, contract.name, proxyAddress); + return proxy.id.toString(); + } + + logger.info(`[${contract.name}] Has proxy instance! Setting target...`); + const proxy = new Src14OwnedProxy(proxyAddress, wallet); + const { waitForResult } = await proxy.functions + .set_proxy_target({ bits: contractId }) + .call(); + await waitForResult(); + logger.success( + `[${contract.name}] Target set! Proxy: ${proxy.id.toB256()} Target: ${contractId}` + ); + return proxy.id.toString(); +}; + +const deployContract = async (config: DeployConfig) => { + const { provider, contract } = config; + + logger.info(`Deploying ${contract.name}...`); + const { contractId, waitForResult: waitForDeploy } = + await contract.factory.deploy({ + configurableConstants: contract.configurableConstants, + }); + await waitForDeploy(); + + logger.success(`${contract.name} deployed! Id: ${contractId}`); + setContractId(provider.url, contract.name, contractId); +}; + +const main = async () => { + const { wallet, provider } = await setup(); + + await deployContractWithProxy({ + wallet, + provider, + contract: { + name: 'registry', + factory: new RegistryFactory(wallet), + }, + }); + + await deployContractWithProxy({ + wallet, + provider, + contract: { + name: 'manager', + factory: new ManagerFactory(wallet), + }, + }); + + await deployContract({ + wallet, + provider, + contract: { + name: 'resolver', + factory: new ResolverFactory(wallet), + }, + }); + + await deployContract({ + wallet, + provider, + contract: { + name: 'nft', + factory: new NftFactory(wallet), + }, + }); +}; + +main() + .then(() => { + logger.success('Done!'); + process.exit(0); + }) + .catch((error) => { + logger.error('Construct failed!', error); + process.exit(1); + }); diff --git a/packages/contracts/scripts/utils.ts b/packages/contracts/scripts/utils.ts index 836716cb..849d4529 100644 --- a/packages/contracts/scripts/utils.ts +++ b/packages/contracts/scripts/utils.ts @@ -1,5 +1,9 @@ +import fs from 'node:fs'; +import path from 'node:path'; import dotenv from 'dotenv'; import { Provider, Wallet } from 'fuels'; +import { type Contracts, type NetworkKeys, resolveNetwork } from '../src'; +import contracts from '../src/artifacts/contracts-fuel.json'; dotenv.config({ path: '../.env', @@ -12,6 +16,28 @@ export const logger = { warn: (...data: any) => console.log(`❌ `, ...data), }; +export const setContractId = ( + provider: string, + contract: Contracts, + contractId: string +) => { + const network = resolveNetwork(provider) as N; + if (!contracts[network]) { + contracts[network] = { + manager: '', + registry: '', + resolver: '', + nft: '', + }; + } + + contracts[network]![contract] = contractId; + fs.writeFileSync( + path.join(__dirname, '..', 'src', './artifacts/contracts-fuel.json'), + JSON.stringify(contracts, null, 2) + ); +}; + export const requireEnv = (name: string) => { const value = process.env[name]; if (!value) { @@ -32,7 +58,7 @@ export const setup = async () => { `Setup Provider: ${providerUrl} Wallet: ${wallet.address.toB256()} - Balance: ${balance.format()} ETH`, + Balance: ${balance.format()} ETH` ); return { provider, wallet }; diff --git a/packages/contracts/src/artifacts/contracts/Manager.ts b/packages/contracts/src/artifacts/contracts/Manager.ts index c59c74f8..94613ffc 100644 --- a/packages/contracts/src/artifacts/contracts/Manager.ts +++ b/packages/contracts/src/artifacts/contracts/Manager.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/ManagerFactory.ts b/packages/contracts/src/artifacts/contracts/ManagerFactory.ts index 005469eb..e9cb9629 100644 --- a/packages/contracts/src/artifacts/contracts/ManagerFactory.ts +++ b/packages/contracts/src/artifacts/contracts/ManagerFactory.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/Nft.ts b/packages/contracts/src/artifacts/contracts/Nft.ts index 32ccaeb7..cdc7a692 100644 --- a/packages/contracts/src/artifacts/contracts/Nft.ts +++ b/packages/contracts/src/artifacts/contracts/Nft.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/NftFactory.ts b/packages/contracts/src/artifacts/contracts/NftFactory.ts index b0d41c73..9349b91f 100644 --- a/packages/contracts/src/artifacts/contracts/NftFactory.ts +++ b/packages/contracts/src/artifacts/contracts/NftFactory.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/Registry.ts b/packages/contracts/src/artifacts/contracts/Registry.ts index a4e33e30..a968b4ed 100644 --- a/packages/contracts/src/artifacts/contracts/Registry.ts +++ b/packages/contracts/src/artifacts/contracts/Registry.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/RegistryFactory.ts b/packages/contracts/src/artifacts/contracts/RegistryFactory.ts index d24b38fe..9076f5ff 100644 --- a/packages/contracts/src/artifacts/contracts/RegistryFactory.ts +++ b/packages/contracts/src/artifacts/contracts/RegistryFactory.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ @@ -15,7 +15,7 @@ import type { Provider, Account, DeployContractOptions } from "fuels"; import { Registry } from "./Registry"; -const bytecode = decompressBytecode("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"); +const bytecode = decompressBytecode("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"); export class RegistryFactory extends __ContractFactory { diff --git a/packages/contracts/src/artifacts/contracts/Resolver.ts b/packages/contracts/src/artifacts/contracts/Resolver.ts index a02921e0..b779c3a1 100644 --- a/packages/contracts/src/artifacts/contracts/Resolver.ts +++ b/packages/contracts/src/artifacts/contracts/Resolver.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/ResolverFactory.ts b/packages/contracts/src/artifacts/contracts/ResolverFactory.ts index fc0ffc96..d991b1d7 100644 --- a/packages/contracts/src/artifacts/contracts/ResolverFactory.ts +++ b/packages/contracts/src/artifacts/contracts/ResolverFactory.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/common.ts b/packages/contracts/src/artifacts/contracts/common.ts index b840116d..327efc4b 100644 --- a/packages/contracts/src/artifacts/contracts/common.ts +++ b/packages/contracts/src/artifacts/contracts/common.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/contracts/index.ts b/packages/contracts/src/artifacts/contracts/index.ts index 634eab2a..b3baa5bc 100644 --- a/packages/contracts/src/artifacts/contracts/index.ts +++ b/packages/contracts/src/artifacts/contracts/index.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/scripts/UploaderValidatorScript.ts b/packages/contracts/src/artifacts/scripts/UploaderValidatorScript.ts index 882dc48b..ae75e50f 100644 --- a/packages/contracts/src/artifacts/scripts/UploaderValidatorScript.ts +++ b/packages/contracts/src/artifacts/scripts/UploaderValidatorScript.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/scripts/common.ts b/packages/contracts/src/artifacts/scripts/common.ts index b840116d..327efc4b 100644 --- a/packages/contracts/src/artifacts/scripts/common.ts +++ b/packages/contracts/src/artifacts/scripts/common.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/artifacts/scripts/index.ts b/packages/contracts/src/artifacts/scripts/index.ts index b667c0cf..88e68c55 100644 --- a/packages/contracts/src/artifacts/scripts/index.ts +++ b/packages/contracts/src/artifacts/scripts/index.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ /* - Fuels version: 0.100.1 + Fuels version: 0.101.3 Forc version: 0.66.4 Fuel-Core version: 0.40.0 */ diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts index 2f6fe87d..2fc01054 100644 --- a/packages/contracts/src/index.ts +++ b/packages/contracts/src/index.ts @@ -1,7 +1,7 @@ import contracts from './artifacts/contracts-fuel.json'; export type NetworkKeys = keyof typeof contracts; -type ContractKeys = keyof (typeof contracts)[N]; +export type Contracts = 'manager' | 'registry' | 'resolver' | 'nft'; const DEFAULT_NETWORK: NetworkKeys = 'testnet'; @@ -23,7 +23,7 @@ export const resolveNetwork = (provider: string) => { export const getContractId = ( provider: string, - contract: ContractKeys + contract: Contracts ) => { const network = resolveNetwork(provider) as N; return contracts[network]?.[contract]; diff --git a/packages/contracts/sway/contracts/manager/Forc.toml b/packages/contracts/sway/contracts/manager/Forc.toml index 3136da0f..14353884 100644 --- a/packages/contracts/sway/contracts/manager/Forc.toml +++ b/packages/contracts/sway/contracts/manager/Forc.toml @@ -7,11 +7,4 @@ name = "manager" [dependencies] lib = { path = "../../lib" } standards = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.6.1" } -sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.24.0" } - -[proxy] -enabled = true -# Testnet -address = "0x39140d7233297276196c49bf13c78ce056083ca8bf61af2698ee3fdeb8af1a8b" -# Mainnet -#address = "0x3ca7ac3db222a740e1c89158d9255afc2c3591ee3f34aedcaaf7cfeceebd0833" \ No newline at end of file +sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.24.0" } \ No newline at end of file diff --git a/packages/contracts/sway/contracts/registry/Forc.toml b/packages/contracts/sway/contracts/registry/Forc.toml index f1fa51ec..30d8bf87 100644 --- a/packages/contracts/sway/contracts/registry/Forc.toml +++ b/packages/contracts/sway/contracts/registry/Forc.toml @@ -7,8 +7,4 @@ name = "registry" [dependencies] standards = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.6.1" } sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.24.0" } -lib = { path = "../../lib" } - -[proxy] -enabled = true -address = "0x4a62d08448e5e91c954dee7244cf2ac09e790de039e96283b2aded0e96d23ec9" \ No newline at end of file +lib = { path = "../../lib" } \ No newline at end of file diff --git a/packages/contracts/sway/contracts/registry/src/main.sw b/packages/contracts/sway/contracts/registry/src/main.sw index 0b6524be..fbf93f27 100644 --- a/packages/contracts/sway/contracts/registry/src/main.sw +++ b/packages/contracts/sway/contracts/registry/src/main.sw @@ -210,10 +210,10 @@ impl Constructor for Contract { require(manager_id != ContractId::zero(), RegistryContractError::ContractNotBeZero); require(token_id != ContractId::zero(), RegistryContractError::ContractNotBeZero); - let contract_id = storage.manager_id.read(); + let contract_id = storage.manager_id.try_read().unwrap_or(ContractId::zero()); require(contract_id == ContractId::zero(), RegistryContractError::AlreadyInitialized); - let contract_id = storage.token_id.read(); + let contract_id = storage.token_id.try_read().unwrap_or(ContractId::zero()); require(contract_id == ContractId::zero(), RegistryContractError::AlreadyInitialized); storage.manager_id.write(manager_id); diff --git a/packages/e2e-tests/.env.example b/packages/e2e-tests/.env.example new file mode 100644 index 00000000..e09aa39b --- /dev/null +++ b/packages/e2e-tests/.env.example @@ -0,0 +1,16 @@ +# Garage URLs +GARAGE_BASE_URL_LOCAL=http://localhost:5173/marketplace +GARAGE_BASE_URL_PREVIEW=https://preview.garage.zone/ + +# Bako ID URLs +BAKO_ID_BASE_URL_LOCAL=http://localhost:5173/ +BAKO_ID_BASE_URL_PREVIEW=https://preview.bako.id/ + +# Legacy URLs +BASE_URL_LOCAL=http://localhost:5173 +NETWORK_LOCAL=http://localhost:4000/v1/graphql + +BASE_URL_PREVIEW=https://preview.bako.id/ +NETWORK_PREVIEW=http://testnet.fuel.network/v1/graphql + +TEST_WALLET_PRIVATE_KEY= diff --git a/packages/e2e-tests/.gitignore b/packages/e2e-tests/.gitignore new file mode 100644 index 00000000..a101de59 --- /dev/null +++ b/packages/e2e-tests/.gitignore @@ -0,0 +1,5 @@ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +.cache \ No newline at end of file diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json new file mode 100644 index 00000000..58797573 --- /dev/null +++ b/packages/e2e-tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "e2e-tests", + "private": true, + "type": "module", + "scripts": { + "test:dev": "playwright test src/tests/", + "test:preview": "PREVIEW_MODE=true playwright test src/tests/", + "test:garage": "PREVIEW_MODE=true playwright test --project=garage", + "test:id": "PREVIEW_MODE=true playwright test --project=bako-id", + "test:e2e": "xvfb-run --auto-servernum -- pnpm exec playwright test src/tests/bako-id/fuel-wallet.test.ts" + }, + "dependencies": { + "@bako-id/ui": "workspace:*" + }, + "devDependencies": { + "@fuels/playwright-utils": "^0.57.1", + "@playwright/test": "^1.53.1", + "@types/node": "^24.5.2", + "dotenv": "^17.2.2", + "fuels": "0.101.3" + } +} diff --git a/packages/e2e-tests/playwright.config.ts b/packages/e2e-tests/playwright.config.ts new file mode 100644 index 00000000..b3f22697 --- /dev/null +++ b/packages/e2e-tests/playwright.config.ts @@ -0,0 +1,58 @@ +import { defineConfig } from '@playwright/test'; +import dotenv from 'dotenv'; + +dotenv.config(); + +const isLocal = process.env.PREVIEW_MODE !== 'true'; + +export default defineConfig({ + globalSetup: './src/global-setup.ts', + testDir: './src/tests', + fullyParallel: true, + retries: 0, + workers: 1, + timeout: 150000, + expect: { + timeout: 8000, + }, + reporter: 'blob', + use: { + headless: true, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + permissions: ['clipboard-read', 'clipboard-write'], + }, + projects: [ + { + name: 'garage', + testDir: './src/tests/garage', + }, + { + name: 'bako-id', + testDir: './src/tests/bako-id', + use: { + baseURL: isLocal + ? process.env.BAKO_ID_BASE_URL_LOCAL + : process.env.BAKO_ID_BASE_URL_PREVIEW, + }, + }, + ], + webServer: isLocal + ? [ + { + command: 'pnpm --filter ui dev', + url: process.env.BASE_URL_LOCAL, + name: 'UI', + timeout: 120_000, + reuseExistingServer: !process.env.CI, + }, + { + command: 'pnpm --filter server exec next start -p 3033', + url: 'http://localhost:3033', + name: 'Server', + timeout: 120_000, + reuseExistingServer: !process.env.CI, + }, + ] + : undefined, +}); diff --git a/apps/ui/tests/ultils/global-setup.ts b/packages/e2e-tests/src/global-setup.ts similarity index 84% rename from apps/ui/tests/ultils/global-setup.ts rename to packages/e2e-tests/src/global-setup.ts index 528947a2..ecd5c99d 100644 --- a/apps/ui/tests/ultils/global-setup.ts +++ b/packages/e2e-tests/src/global-setup.ts @@ -6,7 +6,7 @@ const downloadFuelExtension = async (): Promise => { const FUEL_WALLET_VERSION = '0.55.1'; const absCacheDir = path.resolve( - `./tests/.cache/fuel-wallet/v${FUEL_WALLET_VERSION}`, + `./.cache/fuel-wallet/v${FUEL_WALLET_VERSION}`, ); const relCacheDir = path.relative(process.cwd(), absCacheDir); @@ -34,6 +34,9 @@ const downloadFuelExtension = async (): Promise => { }; const globalSetup = async () => { + const isLocal = process.env.PREVIEW_MODE !== 'true'; + process.env.TEST_NETWORK = isLocal ? process.env.NETWORK_LOCAL : process.env.NETWORK_PREVIEW; + process.env.FUEL_EXTENSION_PATH = await downloadFuelExtension(); }; diff --git a/apps/ui/tests/bako-id/fuel-wallet.test.ts b/packages/e2e-tests/src/tests/bako-id/fuel-wallet.test.ts similarity index 79% rename from apps/ui/tests/bako-id/fuel-wallet.test.ts rename to packages/e2e-tests/src/tests/bako-id/fuel-wallet.test.ts index adcf7769..4d280e4f 100644 --- a/apps/ui/tests/bako-id/fuel-wallet.test.ts +++ b/packages/e2e-tests/src/tests/bako-id/fuel-wallet.test.ts @@ -32,7 +32,7 @@ test.describe('Connect with Fuel Wallet', () => { }); }); - test('search an existing profile', async ({ page }) => { + test.fixme('search an existing profile', async ({ page }) => { await expect(page.getByText('Search new Handle')).toBeVisible(); await page @@ -40,7 +40,7 @@ test.describe('Connect with Fuel Wallet', () => { .fill('@pengus'); await expect(page.getByText('Registered')).toBeVisible(); await page.getByRole('button', { name: 'Continue' }).click(); - await page.goto('https://preview.bako.id/profile/pengus'); + await page.goto('profile/pengus'); await expect(page.getByText('owner0xbd58281c...8ebc4')).toBeVisible(); }); @@ -91,53 +91,19 @@ test.describe('Connect with Fuel Wallet', () => { genesisWallet = E2EUtils.genesisWallet; }); - const newHandle = `automation${Date.now()}`; + let newHandle = `automation${Date.now()}`; console.log('new handle: ', newHandle); const { address1 } = await getAddress(fuelWalletTestHelper); await test.step('create new handle', async () => { - await page - .getByRole('textbox', { name: 'Search for an available Handle' }) - .fill(newHandle); - await page.getByRole('button', { name: 'Continue' }).click(); - - await expect(page.getByText(newHandle)).toBeVisible(); - await expect(page.getByText('Handles0.001 ETH')).toBeVisible(); - - const value = await NewHandleService.getValueNewHandle(page); - - await test.step('connect address 1', async () => { - try { - await page.getByRole('button', { name: 'Connect Wallet' }).click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } catch { - await page - .getByRole('button', { name: 'Connect Wallet' }) - .nth(1) - .click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } - - await transfer(genesisWallet, value, address1); - await page.waitForTimeout(500); - - await fuelWalletTestHelper.walletConnect(['Account 1']); - }); - - await page.getByRole('button', { name: 'Confirm Transaction' }).click(); - - await page - .getByLabel('Bako ID Terms Of Use Agreement') - .locator('div') - .filter({ hasText: '1. The Bako IDThe “Bako ID”' }) - .nth(2) - .evaluate((el) => { - el.scrollTop = el.scrollHeight; - }); - await page.getByRole('button', { name: 'Accept' }).click(); - - await E2ETestUtils.signMessageFuelWallet({ fuelWalletTestHelper, page }); + const { handle } = await NewHandleService.createNewHandle( + page, + fuelWalletTestHelper, + genesisWallet, + newHandle, + ); + newHandle = handle; }); await test.step('edit user', async () => { @@ -392,53 +358,19 @@ test.describe('Connect with Fuel Wallet', () => { genesisWallet = E2EUtils.genesisWallet; }); - const newHandle = `automation${Date.now()}`; + let newHandle = `automation${Date.now()}`; console.log('new handle: ', newHandle); const { address1 } = await getAddress(fuelWalletTestHelper); await test.step('create new handle', async () => { - await page - .getByRole('textbox', { name: 'Search for an available Handle' }) - .fill(newHandle); - await page.getByRole('button', { name: 'Continue' }).click(); - - await expect(page.getByText(newHandle)).toBeVisible(); - await expect(page.getByText('Handles0.001 ETH')).toBeVisible(); - - const value = await NewHandleService.getValueNewHandle(page); - - await test.step('connect address 1', async () => { - try { - await page.getByRole('button', { name: 'Connect Wallet' }).click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } catch { - await page - .getByRole('button', { name: 'Connect Wallet' }) - .nth(1) - .click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } - - await transfer(genesisWallet, value, address1); - await page.waitForTimeout(500); - - await fuelWalletTestHelper.walletConnect(['Account 1']); - }); - - await page.getByRole('button', { name: 'Confirm Transaction' }).click(); - - await page - .getByLabel('Bako ID Terms Of Use Agreement') - .locator('div') - .filter({ hasText: '1. The Bako IDThe “Bako ID”' }) - .nth(2) - .evaluate((el) => { - el.scrollTop = el.scrollHeight; - }); - await page.getByRole('button', { name: 'Accept' }).click(); - - await E2ETestUtils.signMessageFuelWallet({ fuelWalletTestHelper, page }); + const { handle } = await NewHandleService.createNewHandle( + page, + fuelWalletTestHelper, + genesisWallet, + newHandle, + ); + newHandle = handle; await page.getByRole('img', { name: 'Bako logo' }).click(); await page.waitForTimeout(1500); @@ -485,7 +417,9 @@ test.describe('Connect with Fuel Wallet', () => { }); await test.step('search handle in bako safe', async () => { - await page.goto('https://safe.bako.global/'); + await page.goto('https://safe.bako.global/', { + waitUntil: 'networkidle', + }); await AuthTestService.loginAuth(page); @@ -532,56 +466,19 @@ test.describe('Connect with Fuel Wallet', () => { genesisWallet = E2EUtils.genesisWallet; }); - const newHandle = `automation${Date.now()}`; + let newHandle = `automation${Date.now()}`; console.log('new handle: ', newHandle); - const { address1, address2 } = await getAddress(fuelWalletTestHelper); + const { address2 } = await getAddress(fuelWalletTestHelper); await test.step('create new handle', async () => { - await page - .getByRole('textbox', { name: 'Search for an available Handle' }) - .fill(newHandle); - await page.getByRole('button', { name: 'Continue' }).click(); - - await expect(page.getByText(newHandle)).toBeVisible(); - await expect(page.getByText('Handles0.001 ETH')).toBeVisible(); - - const value = await NewHandleService.getValueNewHandle(page); - - await test.step('connect address 1', async () => { - try { - await page.getByRole('button', { name: 'Connect Wallet' }).click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } catch { - await page - .getByRole('button', { name: 'Connect Wallet' }) - .nth(1) - .click(); - await page.getByLabel('Connect to Fuel Wallet').click(); - } - - await transfer(genesisWallet, value, address1); - await page.waitForTimeout(500); - - await fuelWalletTestHelper.walletConnect(['Account 1']); - }); - - await page.getByRole('button', { name: 'Confirm Transaction' }).click(); - - await page - .getByLabel('Bako ID Terms Of Use Agreement') - .locator('div') - .filter({ hasText: '1. The Bako IDThe “Bako ID”' }) - .nth(2) - .evaluate((el) => { - el.scrollTop = el.scrollHeight; - }); - await page.getByRole('button', { name: 'Accept' }).click(); - - await E2ETestUtils.signMessageFuelWallet({ - fuelWalletTestHelper, + const { handle } = await NewHandleService.createNewHandle( page, - }); + fuelWalletTestHelper, + genesisWallet, + newHandle, + ); + newHandle = handle; }); await test.step('edit resolver', async () => { diff --git a/packages/e2e-tests/src/tests/garage/garage.test.ts b/packages/e2e-tests/src/tests/garage/garage.test.ts new file mode 100644 index 00000000..03b163cf --- /dev/null +++ b/packages/e2e-tests/src/tests/garage/garage.test.ts @@ -0,0 +1,399 @@ +import { FuelWalletTestHelper, test } from '@fuels/playwright-utils'; +import { E2ETestUtils } from '../ultils/setup'; +import { WalletUnlocked } from 'fuels'; +import { + getAddress, + modalCloseTest, + returnFundsToGenesisWallet, + transfer, +} from '../ultils/helpers'; +import { expect } from '@playwright/test'; +import { AuthTestService } from '../ultils/service/auth-service'; +import { NFTTestService } from '../ultils/service/nft-service'; +import { NewHandleService } from '../ultils/service/new-handle'; + +await E2ETestUtils.downloadFuelExtension({ test }); + +test.describe.serial('Connect with fuel wallet', () => { + let fuelWalletTestHelper: FuelWalletTestHelper; + let genesisWallet: WalletUnlocked; + const garageUrl = + process.env.PREVIEW_MODE === 'true' + ? process.env.GARAGE_BASE_URL_PREVIEW! + : process.env.GARAGE_BASE_URL_LOCAL!; + + test.beforeEach(async ({ extensionId, context, page }) => { + const E2EUtils = await E2ETestUtils.setupFuelWallet({ + page, + context, + extensionId, + }); + + fuelWalletTestHelper = E2EUtils.fuelWalletTestHelper; + genesisWallet = E2EUtils.genesisWallet; + + await page.goto(garageUrl); + }); + + test('login fuel wallet', async ({ page }) => { + AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 1', + ); + const { address1 } = await getAddress(fuelWalletTestHelper); + + await expect(page.getByRole('button', { name: 'Profile' })).toBeVisible(); + + const buttonName = address1.substring(0, 5) + '...' + address1.slice(-2); + await expect(page.getByRole('button', { name: buttonName })).toBeVisible(); + + await page.getByRole('button', { name: buttonName }).click(); + await page.getByRole('menuitem', { name: 'Disconnect' }).click(); + + await expect( + page.getByRole('button', { name: 'Connect Wallet' }), + ).toBeVisible(); + }); + + test('create and login with passkey', async ({ page }) => { + await AuthTestService.loginAuth(page); + + await expect(page.getByRole('button', { name: 'Profile' })).toBeVisible(); + + await page.waitForTimeout(2000); + await page.locator('[id^="menu-button"]').click(); + await page.getByRole('menuitem', { name: 'Disconnect' }).click(); + + await expect( + page.getByRole('button', { name: 'Connect Wallet' }), + ).toBeVisible(); + }); + + test('mint NFT without tokens', async ({ page }) => { + await test.step('login fuel-wallet', async () => { + AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 1', + ); + }); + + await test.step('try mint 1 thermal punk', async () => { + await page.getByRole('heading', { name: 'Thermal Punk' }).click(); + await page.getByRole('tab', { name: 'Mint' }).click(); + + const mintButton = page.getByRole('button', { name: `Mint 1 NFT` }); + + await expect(mintButton).toBeDisabled(); + + await mintButton.hover(); + await expect(page.getByText('Not enough balance')).toBeVisible(); + }); + }); + + test('mint 1 NFT and list by ETH', async ({ page }) => { + await test.step('login fuel-wallet', async () => { + AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 1', + ); + const { address1 } = await getAddress(fuelWalletTestHelper); + const value = 0.000005; + + await transfer(genesisWallet, value, address1); + }); + + await test.step('mint 1 thermal punk', async () => { + await NFTTestService.mintNFT(page, fuelWalletTestHelper); + }); + + await test.step('confirm and list NFT received', async () => { + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + }); + }); + + test('mint 2 NFT and list by ETH and Fuel', async ({ page }) => { + await test.step('login fuel-wallet', async () => { + AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 1', + ); + const { address1 } = await getAddress(fuelWalletTestHelper); + const value = 0.000005; + + await transfer(genesisWallet, value, address1); + }); + + await test.step('mint 2 thermal punk', async () => { + await NFTTestService.mintNFT( + page, + fuelWalletTestHelper, + 'Thermal Punk', + 2, + ); + }); + + await test.step('confirm and list NFT received', async () => { + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + + const modalList = page.getByRole('button', { name: 'List' }).first(); + await modalCloseTest(page, modalList); + + await page.getByRole('button', { name: 'Confirm listing' }).click(); + await expect(page.getByText('Amount is required')).toBeVisible(); + + await page.getByRole('textbox', { name: 'Asset' }).click(); + await page.getByText('Fuel', { exact: true }).click(); + await page.getByRole('textbox', { name: 'Amount' }).click(); + await page.getByRole('textbox', { name: 'Amount' }).fill('0.00001'); + await page.getByRole('button', { name: 'Confirm listing' }).click(); + await E2ETestUtils.signMessageFuelWallet({ + fuelWalletTestHelper, + page, + }); + const listingPriceElements = page.locator('h2').filter({ + hasText: '0.00001', + has: page.locator('img[src*="fuel.svg"]'), + }); + await expect(listingPriceElements).toHaveCount(1); + }); + + await test.step('deslit NFT on profile', async () => { + await page + .locator('h2') + .filter({ + hasText: '0.00001', + has: page.locator('img[src*="fuel.svg"]'), + }) + .click(); + await page.getByRole('button', { name: 'Delist NFT' }).click(); + await E2ETestUtils.signMessageFuelWallet({ fuelWalletTestHelper, page }); + }); + + await test.step('deslit NFT on profile', async () => { + await page.getByRole('img', { name: 'Logo' }).click(); + await page.getByRole('heading', { name: 'Thermal Punk' }).click(); + await page.getByRole('tab', { name: 'Items' }).click(); + + await page.getByTestId('nft-sale-card').first().click(); + await page.getByRole('button', { name: 'Delist NFT' }).click(); + await E2ETestUtils.signMessageFuelWallet({ fuelWalletTestHelper, page }); + + await page.getByRole('button', { name: 'Profile' }).click(); + await expect(page.getByRole('button', { name: 'List' })).toHaveCount(2); + }); + + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + + await test.step('edit NFT listed', async () => { + await test.step('edit asset and amount', async () => { + await NFTTestService.editListedNFT( + page, + fuelWalletTestHelper, + 'Fuel', + '2.001', + ); + + const listingPriceElements = page.locator('h2').filter({ + hasText: '2.001', + has: page.locator('img[src*="fuel.svg"]'), + }); + await expect(listingPriceElements).toHaveCount(1); + }); + + await test.step('edit asset', async () => { + await NFTTestService.editListedNFT( + page, + fuelWalletTestHelper, + 'Ethereum', + '2.001', + ); + + const listingPriceElements = page.locator('h2').filter({ + hasText: '2.001', + has: page.locator('img[src*="eth.svg"]'), + }); + await expect(listingPriceElements).toHaveCount(1); + }); + + await test.step('edit amount', async () => { + await NFTTestService.editListedNFT( + page, + fuelWalletTestHelper, + 'Ethereum', + ); + + const listingPriceElements = page.locator('h2').filter({ + hasText: '2.001', + has: page.locator('img[src*="eth.svg"]'), + }); + await expect(listingPriceElements).toHaveCount(1); + }); + }); + }); + + test('mint 3 NFT and list by ETH', async ({ page }) => { + await test.step('login fuel-wallet', async () => { + AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 1', + ); + const { address1 } = await getAddress(fuelWalletTestHelper); + const value = 0.000008; + + await transfer(genesisWallet, value, address1); + }); + + await test.step('mint 3 thermal punk', async () => { + await NFTTestService.mintNFT( + page, + fuelWalletTestHelper, + 'Thermal Punk', + 3, + ); + }); + + await test.step('confirm and list NFT received', async () => { + await NFTTestService.listNFTs(page, fuelWalletTestHelper, 3); + }); + }); + + test('buy NFT without tokens', async ({ page }) => { + await AuthTestService.loginWalletConnection(page, fuelWalletTestHelper); + await page.getByRole('heading', { name: 'Thermal Punk' }).click(); + await page.getByRole('tab', { name: 'Items' }).click(); + await page.getByTestId('nft-sale-card').first().click(); + + const buyButton = page.getByRole('button', { name: `Buy` }); + await expect(buyButton).toBeDisabled(); + await buyButton.hover(); + await expect(page.getByText('Not enough balance')).toBeVisible(); + }); + + test('buy and sell NFT', async ({ page }) => { + let nftTitle: string; + await AuthTestService.loginWalletConnection(page, fuelWalletTestHelper); + const { address1, address2 } = await getAddress(fuelWalletTestHelper); + + await transfer(genesisWallet, 0.000015, address1); + await test.step('purchase nft', async () => { + nftTitle = await NFTTestService.buyNFT( + page, + fuelWalletTestHelper, + 'Thermal Punk', + ); + + await page.getByRole('button', { name: 'Profile' }).click(); + await expect(page.getByRole('button', { name: 'List' })).toBeVisible(); + }); + + await test.step('list NFT purchased', async () => { + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + await expect(page.getByText(nftTitle)).toBeVisible(); + }); + + await test.step('switch account and buy NFT listed', async () => { + await transfer(genesisWallet, 0.000015, address2); + const buttonName = address1.substring(0, 5) + '...' + address1.slice(-2); + await expect( + page.getByRole('button', { name: buttonName }), + ).toBeVisible(); + + await page.getByRole('button', { name: buttonName }).click(); + await page.getByRole('menuitem', { name: 'Disconnect' }).click(); + + await AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 2', + ); + await NFTTestService.buyNFT(page, fuelWalletTestHelper, 'Thermal Punk'); + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + }); + + await test.step('verify transaction in fuel explorer', async () => { + await page.goto( + `https://app-testnet.fuel.network/account/${address1}/transactions`, + ); + + await expect(page.getByText('Account')).toBeVisible(); + + await page.getByText('Script').first().click(); + await expect(page.getByText('0.0000096')).toBeVisible(); + }); + }); + + test('buy and sell NFT with handle', async ({ page }) => { + await page.goto('https://preview.bako.id/'); + + let newHandle = `automation${Date.now()}`; + console.log('new handle: ', newHandle); + + const { address1, address2 } = await getAddress(fuelWalletTestHelper); + + await test.step('create new handle', async () => { + const { handle } = await NewHandleService.createNewHandle( + page, + fuelWalletTestHelper, + genesisWallet, + newHandle, + ); + newHandle = handle; + }); + + await page.goto(garageUrl); + let nftTitle: string; + await AuthTestService.loginWalletConnection(page, fuelWalletTestHelper); + + await transfer(genesisWallet, 0.000015, address1); + await test.step('purchase nft', async () => { + nftTitle = await NFTTestService.buyNFT( + page, + fuelWalletTestHelper, + 'Thermal Punk', + ); + + await page.getByRole('button', { name: 'Profile' }).click(); + await expect(page.getByRole('button', { name: 'List' })).toBeVisible(); + }); + + await test.step('list NFT purchased', async () => { + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + await expect(page.getByText(nftTitle)).toBeVisible(); + }); + + await test.step('switch account and buy NFT listed', async () => { + await transfer(genesisWallet, 0.000015, address2); + const buttonName = address1.substring(0, 5) + '...' + address1.slice(-2); + await expect( + page.getByRole('button', { name: buttonName }), + ).toBeVisible(); + + await page.getByRole('button', { name: buttonName }).click(); + await page.getByRole('menuitem', { name: 'Disconnect' }).click(); + + await AuthTestService.loginWalletConnection( + page, + fuelWalletTestHelper, + 'Account 2', + ); + await NFTTestService.buyNFT(page, fuelWalletTestHelper, 'Thermal Punk'); + await NFTTestService.listNFTs(page, fuelWalletTestHelper); + }); + + await test.step('verify transaction in fuel explorer', async () => { + await page.goto( + `https://app-testnet.fuel.network/account/${address1}/transactions`, + ); + + await expect(page.getByText('Account')).toBeVisible(); + + await page.getByText('Script').first().click(); + await expect(page.getByText('0.0000097')).toBeVisible(); + }); + }); +}); diff --git a/apps/ui/tests/ultils/helpers.ts b/packages/e2e-tests/src/tests/ultils/helpers.ts similarity index 79% rename from apps/ui/tests/ultils/helpers.ts rename to packages/e2e-tests/src/tests/ultils/helpers.ts index f9e410cd..cf12950e 100644 --- a/apps/ui/tests/ultils/helpers.ts +++ b/packages/e2e-tests/src/tests/ultils/helpers.ts @@ -1,5 +1,5 @@ import { FuelWalletTestHelper } from '@fuels/playwright-utils'; -import { expect, Page } from '@playwright/test'; +import { expect, Locator, Page } from '@playwright/test'; import { WalletUnlocked } from 'fuels'; export async function transfer( @@ -16,6 +16,16 @@ export async function transfer( console.log(`Transferido ${baseUnits} base units para ${connectedAddress}`); } +export async function modalCloseTest(page: Page, element: Locator) { + await element.click(); + await page.getByLabel('Close modal').click(); + await page.waitForTimeout(750); + await element.click(); + await page.getByText('Cancel').click(); + await page.waitForTimeout(750); + await element.click(); +} + export async function returnFundsToGenesisWallet(config: { fuelWalletTestHelper: FuelWalletTestHelper; genesisAddress: string; @@ -104,3 +114,22 @@ export async function getAddress(fuelWalletTestHelper: FuelWalletTestHelper) { return { address1, address2 }; } + +export async function mockAssets(page: Page) { + await page.route('**/assets', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify([ + { + id: '0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07', + fees: [400, 300], + }, + { + id: '0x324d0c35a4299ef88138a656d5272c5a3a9ccde2630ae055dacaf9d13443d53b', + fees: [100, 0], + }, + ]), + }); + }); +} diff --git a/packages/e2e-tests/src/tests/ultils/service/auth-service.ts b/packages/e2e-tests/src/tests/ultils/service/auth-service.ts new file mode 100644 index 00000000..a5ed5296 --- /dev/null +++ b/packages/e2e-tests/src/tests/ultils/service/auth-service.ts @@ -0,0 +1,63 @@ +import { FuelWalletTestHelper, getByAriaLabel } from '@fuels/playwright-utils'; +import { Page } from '@playwright/test'; +import { WalletUnlocked } from 'fuels'; + +import { E2ETestUtils } from '../setup'; + +interface LoginAuthTestResponse { + username: string; + genesisWallet: WalletUnlocked; +} + +export class AuthTestService { + static async loginAuth( + page: Page, + wallet: WalletUnlocked | null = null, + ): Promise { + await page.getByRole('button', { name: 'Connect Wallet' }).click(); + await page.getByLabel('Connect to Bako Safe').click(); + const popup = await page.waitForEvent('popup'); + + if (!wallet) { + const { genesisWallet } = await E2ETestUtils.setupPasskey({ + page: popup, + }); + wallet = genesisWallet; + } + + const usernameInput = popup.locator('#fixed_id'); + const name = `teste${Date.now()}`; + await usernameInput.fill(name); + + await popup.waitForTimeout(1000); + await getByAriaLabel(popup, 'Create account') + .filter({ has: popup.locator(':visible') }) + .click(); + + const termsOfUseDialog = await popup.$('[aria-label="Terms of Use"]'); + if (termsOfUseDialog) { + await termsOfUseDialog.evaluate((element) => { + element.scrollTop = element.scrollHeight; + }); + } + + await getByAriaLabel(popup, 'Accept Terms of Use').click(); + await getByAriaLabel(popup, 'Begin') + .filter({ has: popup.locator(':visible') }) + .click(); + + await popup.waitForEvent('close'); + + return { username: name, genesisWallet: wallet }; + } + + static async loginWalletConnection( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + account: string = 'Account 1', + ) { + await page.getByRole('button', { name: 'Connect Wallet' }).click(); + await page.getByLabel('Connect to Fuel Wallet').click(); + await fuelWalletTestHelper.walletConnect([account]); + } +} diff --git a/packages/e2e-tests/src/tests/ultils/service/new-handle.ts b/packages/e2e-tests/src/tests/ultils/service/new-handle.ts new file mode 100644 index 00000000..06af2a40 --- /dev/null +++ b/packages/e2e-tests/src/tests/ultils/service/new-handle.ts @@ -0,0 +1,99 @@ +import { FuelWalletTestHelper } from '@fuels/playwright-utils'; +import { Page, expect } from '@playwright/test'; +import { getAddress, transfer } from '../helpers'; +import { E2ETestUtils } from '../setup'; + +export class NewHandleService { + static async getValueNewHandle(page: Page) { + await page.locator('text=Estimated total').waitFor({ state: 'visible' }); + const estimatedTotal = await page.evaluate(() => { + return ( + document + .querySelector( + 'div.chakra-stack.css-10t90fk p.chakra-text.css-io0ltg:nth-of-type(2)', + ) + ?.textContent?.trim() ?? '' + ); + }); + const rawValue = parseFloat(estimatedTotal.replace('ETH', '').trim()); + const value = rawValue + 0.0000002; + + return value; + } + + static async getValueEditProfile( + fuelWalletTestHelper: FuelWalletTestHelper, + page: Page, + ) { + let popupPage: Page; + try { + popupPage = await fuelWalletTestHelper.getWalletPopupPage(); + } catch { + await page.getByRole('button', { name: 'Save changes' }).click(); + await page.getByRole('button', { name: 'Confirm' }).click(); + + popupPage = await fuelWalletTestHelper.getWalletPopupPage(); + } + + const estimatedTotal = parseFloat( + (await popupPage.locator('p[aria-label="fee value:Regular"]').innerText()) + .replace('ETH', '') + .trim(), + ); + + const value = estimatedTotal + 0.0000002; + + return value; + } + + static async createNewHandle( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + genesisWallet: any, + handleName?: string, + ): Promise<{ handle: string; value: number }> { + const newHandle = handleName || `automation${Date.now()}`; + console.log('Creating new handle: ', newHandle); + + await page + .getByRole('textbox', { name: 'Search for an available Handle' }) + .fill(newHandle); + await page.getByRole('button', { name: 'Continue' }).click(); + + await expect(page.getByText(newHandle)).toBeVisible(); + await expect(page.getByText('Handles0.001 ETH')).toBeVisible(); + + const value = await this.getValueNewHandle(page); + + const { address1 } = await getAddress(fuelWalletTestHelper); + + try { + await page.getByRole('button', { name: 'Connect Wallet' }).click(); + await page.getByLabel('Connect to Fuel Wallet').click(); + } catch { + await page.getByRole('button', { name: 'Connect Wallet' }).nth(1).click(); + await page.getByLabel('Connect to Fuel Wallet').click(); + } + + await transfer(genesisWallet, value, address1); + await page.waitForTimeout(500); + + await fuelWalletTestHelper.walletConnect(['Account 1']); + + await page.getByRole('button', { name: 'Confirm Transaction' }).click(); + + await page + .getByLabel('Bako ID Terms Of Use Agreement') + .locator('div') + .filter({ hasText: '1. The Bako IDThe “Bako ID”' }) + .nth(2) + .evaluate((el) => { + el.scrollTop = el.scrollHeight; + }); + await page.getByRole('button', { name: 'Accept' }).click(); + + await E2ETestUtils.signMessageFuelWallet({ fuelWalletTestHelper, page }); + + return { handle: newHandle, value }; + } +} diff --git a/packages/e2e-tests/src/tests/ultils/service/nft-service.ts b/packages/e2e-tests/src/tests/ultils/service/nft-service.ts new file mode 100644 index 00000000..bd58ae35 --- /dev/null +++ b/packages/e2e-tests/src/tests/ultils/service/nft-service.ts @@ -0,0 +1,123 @@ +import { FuelWalletTestHelper } from '@fuels/playwright-utils'; +import { Page, expect } from '@playwright/test'; +import { E2ETestUtils } from '../setup'; +import { modalCloseTest, mockAssets } from '../helpers'; + +export class NFTTestService { + static async mintNFT( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + collectionName: string = 'Thermal Punk', + quantity: number = 1, + ): Promise { + await page.getByRole('heading', { name: collectionName }).click(); + await page.getByRole('tab', { name: 'Mint' }).click(); + + for (let i = 1; i < quantity; i++) { + await page.getByRole('button', { name: 'Increase quantity' }).click(); + } + + await page + .getByRole('button', { + name: `Mint ${quantity} NFT${quantity > 1 ? 's' : ''}`, + }) + .click(); + + await E2ETestUtils.signMessageFuelWallet({ + fuelWalletTestHelper, + page, + }); + + await expect(page.locator('.chakra-modal__content')).toBeVisible(); + + await page.getByTestId('close-modal-button').click(); + } + + static async listNFTs( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + quantity: number = 1, + ): Promise { + await page.getByRole('button', { name: 'Profile' }).click(); + await page.waitForTimeout(1000); + + if (await page.getByText('No items found').isVisible()) { + await page.getByRole('img', { name: 'Logo' }).click(); + await page.getByRole('button', { name: 'Profile' }).click(); + } + + await mockAssets(page); + + for (let i = 0; i < quantity; i++) { + const modalList = page.getByRole('button', { name: 'List' }).first(); + await modalCloseTest(page, modalList); + + await page.getByRole('button', { name: 'Confirm listing' }).click(); + await expect(page.getByText('Amount is required')).toBeVisible(); + + await page.getByRole('textbox', { name: 'Asset' }).click(); + await page.getByText('Ethereum').click(); + await page.getByRole('textbox', { name: 'Amount' }).click(); + await page.getByRole('textbox', { name: 'Amount' }).fill('0.00001'); + await page.getByRole('button', { name: 'Confirm listing' }).click(); + await E2ETestUtils.signMessageFuelWallet({ + fuelWalletTestHelper, + page, + }); + } + + const listingPriceElements = page.locator('h2').filter({ + hasText: '0.00001', + has: page.locator('img[src*="eth.svg"]'), + }); + await expect(listingPriceElements).toHaveCount(quantity); + } + + static async editListedNFT( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + assetName: string = 'Fuel', + amount: string = '0.00001', + ): Promise { + await page.getByTestId('nft-sale-card').first().click(); + await page.getByRole('button', { name: 'Edit order' }).click(); + await mockAssets(page); + await page.getByRole('textbox', { name: 'Asset' }).click(); + await page.getByText(assetName, { exact: true }).click(); + await page.getByRole('textbox', { name: 'Amount' }).fill(amount); + await page.getByRole('button', { name: 'Save new price' }).click(); + await E2ETestUtils.signMessageFuelWallet({ + fuelWalletTestHelper, + page, + }); + } + + static async buyNFT( + page: Page, + fuelWalletTestHelper: FuelWalletTestHelper, + collectionName: string = 'Thermal Punk', + nftIndex: number = 0, + ): Promise { + await page.getByRole('heading', { name: collectionName }).click(); + await page.getByRole('tab', { name: 'Items' }).click(); + const nftCard = page.getByTestId('nft-sale-card').nth(nftIndex); + const nftContent = await nftCard.locator('p').first().textContent(); + const nftInfo = nftContent || 'NFT content not found'; + + await nftCard.click(); + + await page.getByRole('button', { name: 'Buy' }).click(); + + await E2ETestUtils.signMessageFuelWallet({ + fuelWalletTestHelper, + page, + }); + + const closeButton = page.getByTestId('close-modal-button'); + if (await closeButton.isVisible()) { + await closeButton.click(); + } + + return nftInfo; + } +} diff --git a/apps/ui/tests/ultils/setup.ts b/packages/e2e-tests/src/tests/ultils/setup.ts similarity index 74% rename from apps/ui/tests/ultils/setup.ts rename to packages/e2e-tests/src/tests/ultils/setup.ts index db1d2ab5..95288828 100644 --- a/apps/ui/tests/ultils/setup.ts +++ b/packages/e2e-tests/src/tests/ultils/setup.ts @@ -6,6 +6,16 @@ import { import type { BrowserContext, Page } from '@playwright/test'; import { Mnemonic, Provider, Wallet } from 'fuels'; +const buildProvider = () => { + const provider = new Provider(process.env.TEST_NETWORK!); + const genesisWallet = Wallet.fromPrivateKey( + process.env.TEST_WALLET_PRIVATE_KEY!, + provider, + ); + + return { provider, genesisWallet }; +}; + export class E2ETestUtils { static async downloadFuelExtension(config: { test: typeof test }) { config.test.use({ pathToExtension: process.env.FUEL_EXTENSION_PATH }); @@ -17,11 +27,7 @@ export class E2ETestUtils { extensionId: string; }) { const { context, extensionId } = config; - const provider = new Provider('http://testnet.fuel.network/v1/graphql'); - const genesisWallet = Wallet.fromPrivateKey( - '0x5ac4a3075cfeb0a1238efc082978aa6a7a2efe11e6f2ce2b564d708807fab6ad', - provider, - ); + const { provider, genesisWallet } = buildProvider(); const fuelWalletTestHelper = await FuelWalletTestHelper.walletSetup({ context, @@ -34,14 +40,6 @@ export class E2ETestUtils { mnemonic: Mnemonic.generate(), }); - const walletPage = fuelWalletTestHelper.getWalletPage(); - - const closeBtn = walletPage.getByRole('button', { name: 'Close dialog' }); - - if (await closeBtn.isVisible()) { - await closeBtn.click(); - } - await fuelWalletTestHelper.addAccount(); await fuelWalletTestHelper.switchAccount('Account 1'); @@ -51,11 +49,7 @@ export class E2ETestUtils { } static async setupPasskey(config: { page: Page }) { - const provider = new Provider('http://testnet.fuel.network/v1/graphql'); - const genesisWallet = Wallet.fromPrivateKey( - '0x5ac4a3075cfeb0a1238efc082978aa6a7a2efe11e6f2ce2b564d708807fab6ad', - provider, - ); + const { genesisWallet } = buildProvider(); const client = await config.page.context().newCDPSession(config.page); await client.send('WebAuthn.enable'); diff --git a/packages/e2e-tests/tsconfig.json b/packages/e2e-tests/tsconfig.json new file mode 100644 index 00000000..29724e2c --- /dev/null +++ b/packages/e2e-tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + }, + "include": ["src"] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 460795b9..716f08ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,7 +72,7 @@ importers: devDependencies: vitepress: specifier: 1.0.0-rc.41 - version: 1.0.0-rc.41(@algolia/client-search@5.38.0)(@types/node@24.5.2)(@types/react@18.3.24)(axios@1.12.2)(change-case@4.1.2)(idb-keyval@6.2.2)(jwt-decode@3.1.2)(postcss@8.5.6)(qrcode@1.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.4.5) + version: 1.0.0-rc.41(@algolia/client-search@5.38.0)(@types/node@24.5.2)(@types/react@18.3.24)(axios@1.12.2)(change-case@4.1.2)(idb-keyval@6.2.2)(jwt-decode@3.1.2)(postcss@8.5.6)(qrcode@1.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.0)(typescript@5.4.5) apps/indexer: dependencies: @@ -148,7 +148,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.779.0 - version: 3.895.0 + version: 3.896.0 '@bako-id/contracts': specifier: workspace:* version: link:../../packages/contracts @@ -190,7 +190,7 @@ importers: version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fuels: specifier: 0.101.3 - version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) jest: specifier: ^29.6.4 version: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.4.5)) @@ -263,16 +263,16 @@ importers: version: 0.44.0(@tanstack/query-core@5.90.2)(@types/react@18.3.24)(@wagmi/connectors@5.1.7(@types/react@18.3.24)(@wagmi/core@2.13.4(@tanstack/query-core@5.90.2)(@types/react@18.3.24)(react@18.3.1)(typescript@5.4.5)(viem@2.20.1(bufferutil@4.0.9)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@types/react@18.3.24)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.52.2)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.20.1(bufferutil@4.0.9)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(bufferutil@4.0.9)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(vue@3.4.21(typescript@5.4.5))(zod@3.25.76) '@fuels/react': specifier: 0.44.0 - version: 0.44.0(@tanstack/react-query@5.90.2(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.44.0(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': - specifier: ^5.59.16 - version: 5.90.2(react@18.3.1) + specifier: 5.59.16 + version: 5.59.16(react@18.3.1) '@tanstack/react-router': specifier: ^1.77.8 - version: 1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-devtools': specifier: ^1.77.8 - version: 1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) + version: 1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) '@wagmi/connectors': specifier: 5.1.7 version: 5.1.7(@types/react@18.3.24)(@wagmi/core@2.13.4(@tanstack/query-core@5.90.2)(@types/react@18.3.24)(react@18.3.1)(typescript@5.4.5)(viem@2.20.1(bufferutil@4.0.9)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@types/react@18.3.24)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.52.2)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.20.1(bufferutil@4.0.9)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) @@ -334,24 +334,15 @@ importers: specifier: ^5.0.7 version: 5.0.8(@types/react@18.3.24)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) devDependencies: - '@fuels/playwright-utils': - specifier: ^0.57.1 - version: 0.57.1(@playwright/test@1.55.1)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0))) - '@playwright/test': - specifier: ^1.53.1 - version: 1.55.1 '@tanstack/react-query-devtools': specifier: ^5.59.16 - version: 5.90.2(@tanstack/react-query@5.90.2(react@18.3.1))(react@18.3.1) + version: 5.90.2(@tanstack/react-query@5.59.16(react@18.3.1))(react@18.3.1) '@tanstack/router-vite-plugin': specifier: ^1.16.5 - version: 1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0)) + version: 1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0)) '@types/lodash': specifier: ^4.17.0 version: 4.17.20 - '@types/node': - specifier: ^24.0.3 - version: 24.5.2 '@types/react': specifier: ^18.2.43 version: 18.3.24 @@ -393,7 +384,7 @@ importers: dependencies: fuels: specifier: 0.101.3 - version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) + version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) devDependencies: '@shared/tsup': specifier: workspace:* @@ -407,6 +398,31 @@ importers: ts-jest: specifier: ^29.1.1 version: 29.4.4(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.17.19)(jest-util@29.7.0)(jest@29.7.0(@types/node@24.5.2)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.4.5)))(typescript@5.4.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@24.5.2)(typescript@5.4.5) + + packages/e2e-tests: + dependencies: + '@bako-id/ui': + specifier: workspace:* + version: link:../../apps/ui + devDependencies: + '@fuels/playwright-utils': + specifier: ^0.57.1 + version: 0.57.1(@playwright/test@1.55.1)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0))) + '@playwright/test': + specifier: ^1.53.1 + version: 1.55.1 + '@types/node': + specifier: ^24.5.2 + version: 24.5.2 + dotenv: + specifier: ^17.2.2 + version: 17.2.2 + fuels: + specifier: 0.101.3 + version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) packages/graphql: dependencies: @@ -468,7 +484,7 @@ importers: dependencies: fuels: specifier: 0.101.3 - version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) + version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) graphql: specifier: ^16.9.0 version: 16.11.0 @@ -496,13 +512,13 @@ importers: version: link:../../shared/tsup bakosafe: specifier: 0.1.9 - version: 0.1.9(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))) + version: 0.1.9(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0))) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@24.5.2)(typescript@5.4.5) vitest: specifier: ^3.1.1 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0) packages/sdk: dependencies: @@ -533,7 +549,7 @@ importers: version: 16.4.7 fuels: specifier: 0.101.3 - version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + version: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) jest: specifier: ^29.6.4 version: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.4.5)) @@ -681,72 +697,72 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-api-gateway@3.895.0': - resolution: {integrity: sha512-Gd7CboJ03vXxqlNeyPtC+ZhM6IHG5TxtqjojhxNrm8OzZWKqZA8ho+2bBSryvfdZ+CyZqrb7jUqpGhSpVPfURg==} + '@aws-sdk/client-api-gateway@3.896.0': + resolution: {integrity: sha512-pBYP0k+6Ffw43efQm2MnJmHtI2DJzKZR+Bx55ldcmIIj75nn2Q+XecFDJdwFi5wr62PILH+RSI90gp8Cya7R5w==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-cloudformation@3.895.0': - resolution: {integrity: sha512-Pic/FWmx2OxprpMdOxmUdc/yUpCxOUKcTTFKp2GJUZAsEPiH6xDBfxDAEX6hgdopctFGBVBTn+UdS97S1IgLUA==} + '@aws-sdk/client-cloudformation@3.896.0': + resolution: {integrity: sha512-jNt7SabJK94Y2HmUNrEK38OV67DGcU1Yx8suz5W/qmzU4760fPGlsizmZ9dWa3JDa3FpJS5fl6uo4sm1QUYlNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-cognito-identity-provider@3.895.0': - resolution: {integrity: sha512-P9rkoRvaBtRafowwv+oXMsFdW2xrL2zvcizdyq8ZlFov+MweACI4lywcbZ7+krZjUSnctykmo76maVhMfy9Fvw==} + '@aws-sdk/client-cognito-identity-provider@3.896.0': + resolution: {integrity: sha512-02Az7e91MJYxJ8rJYIaNwg2Zrp6z6FhRTS5feDx0H4TafMNFS5VMYF+igad6VGpjE3Q7YEkkC2I3YJOitBsUag==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-eventbridge@3.895.0': - resolution: {integrity: sha512-kRwwBRL2RoFovVNUuoCOST6McKMdEzniv8FWa/IBNDKcnLJXBNBQfUDpjPNZ9ohzsyR1PD4lnpWX9Fu9rM6bPw==} + '@aws-sdk/client-eventbridge@3.896.0': + resolution: {integrity: sha512-hBMhebt2xzmFK6uhhWq4p++0hJs8B1sB2FZnpjhDxbLOoyL4oYE09lPc5rbhKjyHdrLMMcBONJMgcfApLxhPXg==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-iam@3.895.0': - resolution: {integrity: sha512-HzPCC2cCMOoGVgKKxRRGsS4a8Xl6NZz0jBAawTJh+ecUUcQ55HrQlrkqAGwcF9cm+5SBF0YjwVGkyuSYwd0YGw==} + '@aws-sdk/client-iam@3.896.0': + resolution: {integrity: sha512-WLZJtfc322wFEVKPIQQRifGrfwQ9YZIGRcAVRVn8a1FHmItZk/kKjjA/ZkWJ1YOLGp2QY0MuqrK65CUGSsvFfw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-lambda@3.895.0': - resolution: {integrity: sha512-cuc3agKUr4K8B7bEftFeEdHEMnnIVoXuS7hBmLtRx4Sza394+l+0WV5/xnlz1Bd35NGyC/J5ebp1RjqxXzk7IA==} + '@aws-sdk/client-lambda@3.896.0': + resolution: {integrity: sha512-zZX06gmp1GHE+HF1xbNidDF5lzNcm+hkXepJtYkpLEdvJk7Zv8+p6hRZ3kPpmswHmGpb4en1hqSIGgUimQBCXw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.895.0': - resolution: {integrity: sha512-iToLkPFLJOVr5Jx8An3ONIBxplsmjL5LU2F58ISMtXP68PWs195E1uHbDcmjeO5Fiby8lh0SHgPDs7Id28FvLg==} + '@aws-sdk/client-s3@3.896.0': + resolution: {integrity: sha512-UETVuMLQRqgrWxTnavotY0TlB/jaR9sL3hkIFPx4KtjmigNBdwRaiVfOuTnIXKd+w9RPINYG//nnrK+5gIyZkA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.895.0': - resolution: {integrity: sha512-AQHk6iJrwce/NwZa5/Njy0ZGoHdxWCajkgufhXk53L0kRiC3vUPPWEV1m1F3etQWhaUsatcO2xtRuKvLpe4zgA==} + '@aws-sdk/client-sso@3.896.0': + resolution: {integrity: sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.895.0': - resolution: {integrity: sha512-tDlAk5Xjminr3/rvFjmfB5PTb7VEo628DQEqV79ReM+RRQQCEesZ/s5zMRua/QeUmaq0V2QAnr24ELTbfAEYqQ==} + '@aws-sdk/client-sts@3.896.0': + resolution: {integrity: sha512-mEbbWGwGZbKCHgwAIm9aRCRcCnv6N9AZf3U0dMFwpYtVXVJvRWTK0OW2d49I2swaZ/GikMIccI3wxWT188OW8w==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.894.0': - resolution: {integrity: sha512-7zbO31NV2FaocmMtWOg/fuTk3PC2Ji2AC0Fi2KqrppEDIcwLlTTuT9w/rdu/93Pz+wyUhCxWnDc0tPbwtCLs+A==} + '@aws-sdk/core@3.896.0': + resolution: {integrity: sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.894.0': - resolution: {integrity: sha512-2aiQJIRWOuROPPISKgzQnH/HqSfucdk5z5VMemVH3Mm2EYOrzBwmmiiFpmSMN3ST+sE8c7gusqycUchP+KfALQ==} + '@aws-sdk/credential-provider-env@3.896.0': + resolution: {integrity: sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.894.0': - resolution: {integrity: sha512-Z5QQpqFRflszrT+lUq6+ORuu4jRDcpgCUSoTtlhczidMqfdOSckKmK3chZEfmUUJPSwoFQZ7EiVTsX3c886fBg==} + '@aws-sdk/credential-provider-http@3.896.0': + resolution: {integrity: sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.895.0': - resolution: {integrity: sha512-uIh7N4IN/yIk+qYMAkVpVkjhB90SGKSfaXEVcnmxzBDG6e5304HKT0esqoCVZvtFfLKasjm2TOpalM5l3fi/dA==} + '@aws-sdk/credential-provider-ini@3.896.0': + resolution: {integrity: sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.895.0': - resolution: {integrity: sha512-7xsBCmkBUz+2sNqNsDJ1uyQsBvwhNFzwFt8wX39WrFJTpTQh3uNQ5g8QH21BbkKqIFKCLdvgHgwt3Ub5RGVuPA==} + '@aws-sdk/credential-provider-node@3.896.0': + resolution: {integrity: sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.894.0': - resolution: {integrity: sha512-VU74GNsj+SsO+pl4d+JimlQ7+AcderZaC6bFndQssQdFZ5NRad8yFNz5Xbec8CPJr+z/VAwHib6431F5nYF46g==} + '@aws-sdk/credential-provider-process@3.896.0': + resolution: {integrity: sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.895.0': - resolution: {integrity: sha512-bZCcHUZGz+XlCaK0KEOHGHkMtlwIvnpxJvlZtSCVaBdX/IgouxaB42fxChflxSMRWF45ygdezfky4i17f6vC4w==} + '@aws-sdk/credential-provider-sso@3.896.0': + resolution: {integrity: sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.895.0': - resolution: {integrity: sha512-tKbXbOp2xrL02fxKvB7ko1E4Uvyy5TF9qi5pT2MVWNnfSsBlUM80aJ6tyUPKWXdUTdAlPrU3XcwgQl/DnnRa9A==} + '@aws-sdk/credential-provider-web-identity@3.896.0': + resolution: {integrity: sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.893.0': @@ -757,8 +773,8 @@ packages: resolution: {integrity: sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.894.0': - resolution: {integrity: sha512-Dcz3thFO+9ZvTXV+Q4v/2okfMY8sUCHHBqJMUf9BDEuSvV94JVXFXbu1rm6S/N1Rh0gMLoUVzrOk3W84BLGPsg==} + '@aws-sdk/middleware-flexible-checksums@3.896.0': + resolution: {integrity: sha512-bB3W/IFG7HNNziACOp1aZVGGnrIahXc0PxZoU055JirEGQtDFIU1ZD7S9zLKmy9FFUvQsAeRL9nDFHbx8cwx/w==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.893.0': @@ -781,32 +797,32 @@ packages: resolution: {integrity: sha512-Uhd57OuAVFMYG26aI/BFH5uUGSupu+iOMEDmkjj5awHDEqRIFWR5Cs5Il3/w+TdlKOZ6ptF0ARi6hDZC2GfVKw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.894.0': - resolution: {integrity: sha512-0C3lTVdTuv5CkJ4LulpA7FmGFSKrGUKxnFZ6+qGjYjNzbdiHXfq0TyEBiDmVqDkoV2k4AT2H/m0Xw//rTkcNEQ==} + '@aws-sdk/middleware-sdk-s3@3.896.0': + resolution: {integrity: sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.893.0': resolution: {integrity: sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.895.0': - resolution: {integrity: sha512-JUqQW2RPp4I95wZ/Im9fTiaX3DF55oJgeoiNlLdHkQZPSNNS/pT1WMWMReSvJdcfSNU3xSUaLtI+h4mQjQUDbQ==} + '@aws-sdk/middleware-user-agent@3.896.0': + resolution: {integrity: sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.895.0': - resolution: {integrity: sha512-8w1ihfYgvds6kfal/qJXQQrHRsKYh2nujSyzWMo2TMKMze9WPZA93G4mRbRtKtbSuQ66mVWePH8Cksq35ABu2Q==} + '@aws-sdk/nested-clients@3.896.0': + resolution: {integrity: sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.893.0': resolution: {integrity: sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.894.0': - resolution: {integrity: sha512-Te5b3fSbatkZrh3eYNmpOadZFKsCLNSwiolQKQeEeKHxdnqORwYXa+0ypcTHle6ukic+tFRRd9n3NuMVo9uiVg==} + '@aws-sdk/signature-v4-multi-region@3.896.0': + resolution: {integrity: sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.895.0': - resolution: {integrity: sha512-vJqrEHFFGRZ3ok5T+jII00sa2DQ3HdVkTBIfM0DcrcPssqDV18VKdA767qiBdIEN/cygjdBg8Ri/cuq6ER9BeQ==} + '@aws-sdk/token-providers@3.896.0': + resolution: {integrity: sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.893.0': @@ -828,8 +844,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.893.0': resolution: {integrity: sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==} - '@aws-sdk/util-user-agent-node@3.895.0': - resolution: {integrity: sha512-lLRC7BAFOPtJk4cZC0Q0MZBMCGF109QpGnug3L3n/2TJW02Sinz9lzA0ykBpYXe9j60LjIYSENCg+F4DZE5vxg==} + '@aws-sdk/util-user-agent-node@3.896.0': + resolution: {integrity: sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -3714,7 +3730,6 @@ packages: '@resvg/resvg-js-linux-x64-gnu@2.6.2': resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} engines: {node: '>= 10'} - cpu: [x64] os: [linux] '@resvg/resvg-js-linux-x64-musl@2.6.2': @@ -4303,6 +4318,9 @@ packages: resolution: {integrity: sha512-GG2R9I6QSlbNR9fEuX2sQCigY6K28w51h2634TWmkaHXlzQw+rWuIWr4nAGM9doA+kWRi1LFSFMvAiG3cOqjXQ==} engines: {node: '>=12'} + '@tanstack/query-core@5.59.16': + resolution: {integrity: sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==} + '@tanstack/query-core@5.90.2': resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} @@ -4315,21 +4333,26 @@ packages: '@tanstack/react-query': ^5.90.2 react: ^18 || ^19 + '@tanstack/react-query@5.59.16': + resolution: {integrity: sha512-MuyWheG47h6ERd4PKQ6V8gDyBu3ThNG22e1fRVwvq6ap3EqsFhyuxCAwhNP/03m/mLg+DAb0upgbPaX6VB+CkQ==} + peerDependencies: + react: ^18 || ^19 + '@tanstack/react-query@5.90.2': resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.132.2': - resolution: {integrity: sha512-Vxltjzdc2BDKVGflESGcZIMAqfrCqlpzh6kEsrzt0xC5XkTcjJO9ZupWOuIN/3oMGcX7gqCpWiemaTKBOM5Djw==} + '@tanstack/react-router-devtools@1.132.6': + resolution: {integrity: sha512-NwcStEA5ePPGvuogDONuQX5oDL+Wl3NI7N5HiI9rqcOSY5kF85DfaMrTBADS8r1CCY7NMjRrjULEfgR8Z1CrxA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.132.2 + '@tanstack/react-router': ^1.132.6 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.132.2': - resolution: {integrity: sha512-667txdisNZVLS8jZnu8HNe8fhQAvayMobUBAGsLjMN7YWOT9F9YwGA1tHugtm0PkfS6k4aevBcNpCKZbJsHc5w==} + '@tanstack/react-router@1.132.6': + resolution: {integrity: sha512-YfRHfEzOS2TtrP0+nQ98aUvqQBg6uNRZPzOT4X35lLOwmXJbK8dTzlZva5KhfT5wrkZfU5N8jSc0COB+ALwkLQ==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -4347,15 +4370,15 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.132.2': - resolution: {integrity: sha512-PDaEp1tmBirGaNDtrV6AS7awbO42GCegNTxMi0H1mwgWccDwp6RUS7nOF33jPzfBJXhDJ0xFBNdRI3ItakZgug==} + '@tanstack/router-core@1.132.6': + resolution: {integrity: sha512-K5DqCnCSaxRw1BN63aZaZCkTKsGTXkAikzlTBSMVeijLE+D5P1Q9+m7xfuhVkr1sa/0yNNeP5VBmw28AZhnoJA==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.132.2': - resolution: {integrity: sha512-QdBv1Z1dxqnMn1RHvcL58cPQEW3yFmBW+gOK6mr4pzPTPzJpqVP/UA7Mg9wHJGUG50EywTIiWB/x3OrcwVR0Ww==} + '@tanstack/router-devtools-core@1.132.6': + resolution: {integrity: sha512-j1r97ox6cSMXX6Rh8I+ReFelGoRyrCE030/7auZpxO/hhVfQHcTeIhMwXh9/I54XIEx70SnG6UVEUKuP9AhT8g==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.132.2 + '@tanstack/router-core': ^1.132.6 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -4363,11 +4386,11 @@ packages: csstype: optional: true - '@tanstack/router-devtools@1.132.2': - resolution: {integrity: sha512-TTskfeqd2y1EB0cHZH5EFSJh8kwXAOWlTpmNgy5azQogABrtjmBe6+ZofSO0yd/2+TR2kiojVgqi2lxp1EU2nw==} + '@tanstack/router-devtools@1.132.6': + resolution: {integrity: sha512-aakqMpVL2v7w7ecvY1PP1DKNh0CEpfzZxfK/UBAb63+r8Mrym6wc1pBF8jbEYWQSlhtJG0Sk1bSeaBmHPuwZEw==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.132.2 + '@tanstack/react-router': ^1.132.6 csstype: ^3.0.10 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -4375,16 +4398,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.132.2': - resolution: {integrity: sha512-Y3wnh+aMJtNXr9v+IoeIlN3o/I82y6vpu00mKMIJt4YlgDbsdQXRqriJolvfFpMMjKqYxUo9NE2/KvKI9zUm5A==} + '@tanstack/router-generator@1.132.6': + resolution: {integrity: sha512-C09gIsljx72HpOzmjEZp+1YgAmD6DnOpr+UZcdIEgaLtc9hqCZ+JO2YJZuSxsMIRizjovCP+fmcKDSuVUgCwLA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.132.2': - resolution: {integrity: sha512-gizOuK733HnqW2UqjkYCK4fUuxvKtD8bWw6H2HXnLPbxoLfDXAiMJ1qD7vnSAg1Ovts19k0wGGAJtcdZu+3FJA==} + '@tanstack/router-plugin@1.132.6': + resolution: {integrity: sha512-PmcMLBY0Y3Fnjo17O/BQm8IrMxJgli6DTT/0+7420+KbYXL8D30BG4xURj0gzYR0Kh7vHO6DK/c6r9NBPa+0zQ==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.132.2 + '@tanstack/react-router': ^1.132.6 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.8 webpack: '>=5.92.0' @@ -4404,8 +4427,8 @@ packages: resolution: {integrity: sha512-WDnvAi9kO20joLDzlsTvfgXNv+FgQ4G98xAD8r4jKWoTdTTG05DU2sRYimtbdq4Q7E3uVdvyvPdhRy45wan7bw==} engines: {node: '>=12'} - '@tanstack/router-vite-plugin@1.132.2': - resolution: {integrity: sha512-HaAgJl2qt6WUVxLeav9eIoG3tSakW/NF0XawS9IIWIbHCKAhHo+xwQ/M+LsgVSJboAGQEX/HsGjjsi6s+Yiztg==} + '@tanstack/router-vite-plugin@1.132.6': + resolution: {integrity: sha512-9XGpJTilZU+hc5u8Eu3sVhTNxacwtNDK+5CskZO0TKCTcXxGEUb9WrfKm1CV/45Da8nvKN3Dj2Fko38/jDLNfA==} engines: {node: '>=12'} '@tanstack/store@0.7.7': @@ -4651,9 +4674,6 @@ packages: '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.15.3': resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} @@ -5863,8 +5883,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001745: + resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -6700,6 +6720,10 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dotenv@17.2.2: + resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} + engines: {node: '>=12'} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -11082,8 +11106,8 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} to-regex-range@5.0.1: @@ -12416,22 +12440,22 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-api-gateway@3.895.0': + '@aws-sdk/client-api-gateway@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 '@aws-sdk/middleware-sdk-api-gateway': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12462,21 +12486,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cloudformation@3.895.0': + '@aws-sdk/client-cloudformation@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12503,27 +12527,26 @@ snapshots: '@smithy/util-retry': 4.1.2 '@smithy/util-utf8': 4.1.0 '@smithy/util-waiter': 4.1.1 - '@types/uuid': 9.0.8 + '@smithy/uuid': 1.0.0 tslib: 2.8.1 - uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cognito-identity-provider@3.895.0': + '@aws-sdk/client-cognito-identity-provider@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12553,22 +12576,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-eventbridge@3.895.0': + '@aws-sdk/client-eventbridge@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 - '@aws-sdk/signature-v4-multi-region': 3.894.0 + '@aws-sdk/signature-v4-multi-region': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12598,21 +12621,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-iam@3.895.0': + '@aws-sdk/client-iam@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12643,21 +12666,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-lambda@3.895.0': + '@aws-sdk/client-lambda@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/eventstream-serde-browser': 4.1.1 @@ -12692,29 +12715,29 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.895.0': + '@aws-sdk/client-s3@3.896.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-bucket-endpoint': 3.893.0 '@aws-sdk/middleware-expect-continue': 3.893.0 - '@aws-sdk/middleware-flexible-checksums': 3.894.0 + '@aws-sdk/middleware-flexible-checksums': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-location-constraint': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-sdk-s3': 3.894.0 + '@aws-sdk/middleware-sdk-s3': 3.896.0 '@aws-sdk/middleware-ssec': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 - '@aws-sdk/signature-v4-multi-region': 3.894.0 + '@aws-sdk/signature-v4-multi-region': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@aws-sdk/xml-builder': 3.894.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 @@ -12749,26 +12772,25 @@ snapshots: '@smithy/util-stream': 4.3.2 '@smithy/util-utf8': 4.1.0 '@smithy/util-waiter': 4.1.1 - '@types/uuid': 9.0.8 + '@smithy/uuid': 1.0.0 tslib: 2.8.1 - uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.895.0': + '@aws-sdk/client-sso@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12798,21 +12820,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.895.0': + '@aws-sdk/client-sts@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-node': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -12842,7 +12864,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.894.0': + '@aws-sdk/core@3.896.0': dependencies: '@aws-sdk/types': 3.893.0 '@aws-sdk/xml-builder': 3.894.0 @@ -12854,22 +12876,21 @@ snapshots: '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-middleware': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.894.0': + '@aws-sdk/credential-provider-env@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.894.0': + '@aws-sdk/credential-provider-http@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/node-http-handler': 4.2.1 @@ -12880,15 +12901,15 @@ snapshots: '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.895.0': + '@aws-sdk/credential-provider-ini@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 - '@aws-sdk/credential-provider-env': 3.894.0 - '@aws-sdk/credential-provider-http': 3.894.0 - '@aws-sdk/credential-provider-process': 3.894.0 - '@aws-sdk/credential-provider-sso': 3.895.0 - '@aws-sdk/credential-provider-web-identity': 3.895.0 - '@aws-sdk/nested-clients': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-env': 3.896.0 + '@aws-sdk/credential-provider-http': 3.896.0 + '@aws-sdk/credential-provider-process': 3.896.0 + '@aws-sdk/credential-provider-sso': 3.896.0 + '@aws-sdk/credential-provider-web-identity': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -12898,14 +12919,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.895.0': + '@aws-sdk/credential-provider-node@3.896.0': dependencies: - '@aws-sdk/credential-provider-env': 3.894.0 - '@aws-sdk/credential-provider-http': 3.894.0 - '@aws-sdk/credential-provider-ini': 3.895.0 - '@aws-sdk/credential-provider-process': 3.894.0 - '@aws-sdk/credential-provider-sso': 3.895.0 - '@aws-sdk/credential-provider-web-identity': 3.895.0 + '@aws-sdk/credential-provider-env': 3.896.0 + '@aws-sdk/credential-provider-http': 3.896.0 + '@aws-sdk/credential-provider-ini': 3.896.0 + '@aws-sdk/credential-provider-process': 3.896.0 + '@aws-sdk/credential-provider-sso': 3.896.0 + '@aws-sdk/credential-provider-web-identity': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -12915,20 +12936,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.894.0': + '@aws-sdk/credential-provider-process@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.895.0': + '@aws-sdk/credential-provider-sso@3.896.0': dependencies: - '@aws-sdk/client-sso': 3.895.0 - '@aws-sdk/core': 3.894.0 - '@aws-sdk/token-providers': 3.895.0 + '@aws-sdk/client-sso': 3.896.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/token-providers': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -12937,10 +12958,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.895.0': + '@aws-sdk/credential-provider-web-identity@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 - '@aws-sdk/nested-clients': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -12966,12 +12987,12 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.894.0': + '@aws-sdk/middleware-flexible-checksums@3.896.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/is-array-buffer': 4.1.0 '@smithy/node-config-provider': 4.2.2 @@ -13016,9 +13037,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.894.0': + '@aws-sdk/middleware-sdk-s3@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-arn-parser': 3.893.0 '@smithy/core': 3.12.0 @@ -13039,9 +13060,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.895.0': + '@aws-sdk/middleware-user-agent@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@smithy/core': 3.12.0 @@ -13049,20 +13070,20 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.895.0': + '@aws-sdk/nested-clients@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.894.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.895.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 @@ -13101,19 +13122,19 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.894.0': + '@aws-sdk/signature-v4-multi-region@3.896.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.894.0 + '@aws-sdk/middleware-sdk-s3': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.895.0': + '@aws-sdk/token-providers@3.896.0': dependencies: - '@aws-sdk/core': 3.894.0 - '@aws-sdk/nested-clients': 3.895.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -13150,9 +13171,9 @@ snapshots: bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.895.0': + '@aws-sdk/util-user-agent-node@3.896.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.895.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/node-config-provider': 4.2.2 '@smithy/types': 4.5.0 @@ -14298,13 +14319,13 @@ snapshots: '@fastify/busboy@3.2.0': {} - '@fuel-ts/abi-coder@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/abi-coder@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) type-fest: 4.34.1 transitivePeerDependencies: - vitest @@ -14320,21 +14341,10 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/abi-coder@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/abi-typegen@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - type-fest: 4.34.1 - transitivePeerDependencies: - - vitest - - '@fuel-ts/abi-typegen@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/versions': 0.101.3 commander: 13.1.0 glob: 10.4.5 @@ -14359,31 +14369,17 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/abi-typegen@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/versions': 0.101.3 - commander: 13.1.0 - glob: 10.4.5 - handlebars: 4.7.8 - mkdirp: 3.0.1 - ramda: 0.30.1 - rimraf: 5.0.10 - transitivePeerDependencies: - - vitest - - '@fuel-ts/account@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/account@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 - '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/versions': 0.101.3 '@fuels/vm-asm': 0.60.2 '@noble/curves': 1.8.1 @@ -14419,34 +14415,11 @@ snapshots: - encoding - vitest - '@fuel-ts/account@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/address@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/versions': 0.101.3 - '@fuels/vm-asm': 0.60.2 - '@noble/curves': 1.8.1 - events: 3.3.0 - graphql: 16.10.0 - graphql-request: 6.1.0(graphql@16.10.0) - graphql-tag: 2.12.6(graphql@16.10.0) - ramda: 0.30.1 - transitivePeerDependencies: - - encoding - - vitest - - '@fuel-ts/address@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@noble/hashes': 1.7.1 transitivePeerDependencies: - vitest @@ -14460,27 +14433,18 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/address@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@noble/hashes': 1.7.1 - transitivePeerDependencies: - - vitest - - '@fuel-ts/contract@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/contract@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 - '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuels/vm-asm': 0.60.2 ramda: 0.30.1 transitivePeerDependencies: @@ -14505,28 +14469,10 @@ snapshots: - encoding - vitest - '@fuel-ts/contract@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/crypto@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/merkle': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuels/vm-asm': 0.60.2 - ramda: 0.30.1 - transitivePeerDependencies: - - encoding - - vitest - - '@fuel-ts/crypto@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@noble/hashes': 1.7.1 transitivePeerDependencies: - vitest @@ -14539,14 +14485,6 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/crypto@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@noble/hashes': 1.7.1 - transitivePeerDependencies: - - vitest - '@fuel-ts/errors@0.100.6': dependencies: '@fuel-ts/versions': 0.100.6 @@ -14555,10 +14493,10 @@ snapshots: dependencies: '@fuel-ts/versions': 0.101.3 - '@fuel-ts/hasher@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/hasher@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@noble/hashes': 1.7.1 transitivePeerDependencies: - vitest @@ -14571,23 +14509,15 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/hasher@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@noble/hashes': 1.7.1 - transitivePeerDependencies: - - vitest - '@fuel-ts/math@0.101.3': dependencies: '@fuel-ts/errors': 0.101.3 '@types/bn.js': 5.1.6 bn.js: 5.2.1 - '@fuel-ts/merkle@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/merkle@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 transitivePeerDependencies: - vitest @@ -14599,22 +14529,15 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/merkle@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/program@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - transitivePeerDependencies: - - vitest - - '@fuel-ts/program@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 '@fuel-ts/math': 0.101.3 - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuels/vm-asm': 0.60.2 ramda: 0.30.1 transitivePeerDependencies: @@ -14636,31 +14559,16 @@ snapshots: - encoding - vitest - '@fuel-ts/program@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/recipes@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/math': 0.101.3 - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuels/vm-asm': 0.60.2 - ramda: 0.30.1 - transitivePeerDependencies: - - encoding - - vitest - - '@fuel-ts/recipes@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) transitivePeerDependencies: - encoding - vitest @@ -14679,29 +14587,15 @@ snapshots: - encoding - vitest - '@fuel-ts/recipes@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - transitivePeerDependencies: - - encoding - - vitest - - '@fuel-ts/script@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/script@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 '@fuel-ts/math': 0.101.3 - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) transitivePeerDependencies: - encoding - vitest @@ -14719,27 +14613,14 @@ snapshots: - encoding - vitest - '@fuel-ts/script@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': + '@fuel-ts/transactions@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - transitivePeerDependencies: - - encoding - - vitest - - '@fuel-ts/transactions@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) transitivePeerDependencies: - vitest @@ -14754,24 +14635,13 @@ snapshots: transitivePeerDependencies: - vitest - '@fuel-ts/transactions@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - transitivePeerDependencies: - - vitest - - '@fuel-ts/utils@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17))': + '@fuel-ts/utils@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@fuel-ts/errors': 0.101.3 '@fuel-ts/math': 0.101.3 '@fuel-ts/versions': 0.101.3 fflate: 0.8.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0) '@fuel-ts/utils@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0))': dependencies: @@ -14781,14 +14651,6 @@ snapshots: fflate: 0.8.2 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0) - '@fuel-ts/utils@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))': - dependencies: - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/math': 0.101.3 - '@fuel-ts/versions': 0.101.3 - fflate: 0.8.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2) - '@fuel-ts/versions@0.100.6': dependencies: chalk: 4.1.2 @@ -14853,10 +14715,10 @@ snapshots: adm-zip: 0.5.16 fuels: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) - '@fuels/react@0.44.0(@tanstack/react-query@5.90.2(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fuels/react@0.44.0(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query': 5.90.2(react@18.3.1) + '@tanstack/react-query': 5.59.16(react@18.3.1) events: 3.3.0 fuels: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) react: 18.3.1 @@ -15697,7 +15559,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -15710,14 +15572,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15745,14 +15607,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.18.6)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.18.6)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15780,14 +15642,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15816,7 +15678,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -15834,7 +15696,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.18.6 + '@types/node': 20.19.17 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -15856,7 +15718,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -15926,7 +15788,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.6 + '@types/node': 20.19.17 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -17075,8 +16937,8 @@ snapshots: '@serverless/dashboard-plugin@7.2.3(@types/node@16.18.126)(bufferutil@4.0.9)(supports-color@8.1.1)(utf-8-validate@5.0.10)': dependencies: - '@aws-sdk/client-cloudformation': 3.895.0 - '@aws-sdk/client-sts': 3.895.0 + '@aws-sdk/client-cloudformation': 3.896.0 + '@aws-sdk/client-sts': 3.896.0 '@serverless/event-mocks': 1.1.1 '@serverless/platform-client': 4.5.1(bufferutil@4.0.9)(supports-color@8.1.1)(utf-8-validate@5.0.10) '@serverless/utils': 6.15.0(@types/node@16.18.126) @@ -17802,14 +17664,21 @@ snapshots: '@tanstack/history@1.132.0': {} + '@tanstack/query-core@5.59.16': {} + '@tanstack/query-core@5.90.2': {} '@tanstack/query-devtools@5.90.1': {} - '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.2(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.59.16(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-devtools': 5.90.1 - '@tanstack/react-query': 5.90.2(react@18.3.1) + '@tanstack/react-query': 5.59.16(react@18.3.1) + react: 18.3.1 + + '@tanstack/react-query@5.59.16(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.59.16 react: 18.3.1 '@tanstack/react-query@5.90.2(react@18.3.1)': @@ -17817,10 +17686,10 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 18.3.1 - '@tanstack/react-router-devtools@1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-devtools-core': 1.132.2(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) + '@tanstack/react-router': 1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-devtools-core': 1.132.6(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) @@ -17841,11 +17710,11 @@ snapshots: - tsx - yaml - '@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/history': 1.132.0 '@tanstack/react-store': 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.132.2 + '@tanstack/router-core': 1.132.6 isbot: 5.1.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17865,7 +17734,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/router-core@1.132.2': + '@tanstack/router-core@1.132.6': dependencies: '@tanstack/history': 1.132.0 '@tanstack/store': 0.7.7 @@ -17875,9 +17744,9 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.2(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.132.6(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.132.2 + '@tanstack/router-core': 1.132.6 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 @@ -17898,10 +17767,10 @@ snapshots: - tsx - yaml - '@tanstack/router-devtools@1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': + '@tanstack/router-devtools@1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-router-devtools': 1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) + '@tanstack/react-router': 1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router-devtools': 1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tanstack/router-core@1.132.6)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) react: 18.3.1 @@ -17925,9 +17794,9 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.132.2': + '@tanstack/router-generator@1.132.6': dependencies: - '@tanstack/router-core': 1.132.2 + '@tanstack/router-core': 1.132.6 '@tanstack/router-utils': 1.132.0 '@tanstack/virtual-file-routes': 1.132.0 prettier: 3.6.2 @@ -17938,7 +17807,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))': + '@tanstack/router-plugin@1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -17946,8 +17815,8 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.2 - '@tanstack/router-generator': 1.132.2 + '@tanstack/router-core': 1.132.6 + '@tanstack/router-generator': 1.132.6 '@tanstack/router-utils': 1.132.0 '@tanstack/virtual-file-routes': 1.132.0 babel-dead-code-elimination: 1.0.10 @@ -17955,7 +17824,7 @@ snapshots: unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -17973,9 +17842,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-vite-plugin@1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))': + '@tanstack/router-vite-plugin@1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))': dependencies: - '@tanstack/router-plugin': 1.132.2(@tanstack/react-router@1.132.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0)) + '@tanstack/router-plugin': 1.132.6(@tanstack/react-router@1.132.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0)) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -18074,7 +17943,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.5.2 + '@types/node': 20.19.17 '@types/d3-scale-chromatic@3.1.0': {} @@ -18105,7 +17974,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.18.6 + '@types/node': 20.19.17 '@types/hast@2.3.10': dependencies: @@ -18181,7 +18050,7 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.18.6 + '@types/node': 20.19.17 form-data: 4.0.4 '@types/node@10.12.18': {} @@ -18241,8 +18110,6 @@ snapshots: '@types/uuid@8.3.4': {} - '@types/uuid@9.0.8': {} - '@types/validator@13.15.3': {} '@types/web-bluetooth@0.0.20': {} @@ -18251,7 +18118,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 24.5.2 + '@types/node': 20.19.17 '@types/ws@8.18.1': dependencies: @@ -18422,7 +18289,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.20(@types/node@24.5.2))(vue@3.4.21(typescript@5.4.5))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))(vue@3.4.21(typescript@5.4.5))': dependencies: vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) vue: 3.4.21(typescript@5.4.5) @@ -18435,13 +18302,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@20.19.17))': + '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 5.4.20(@types/node@20.19.17) + vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))': dependencies: @@ -18451,14 +18318,6 @@ snapshots: optionalDependencies: vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) - '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@24.5.2))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.19 - optionalDependencies: - vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) - '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -20416,11 +20275,11 @@ snapshots: bail@2.0.2: {} - bakosafe@0.1.9(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2))): + bakosafe@0.1.9(fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0))): dependencies: '@noble/curves': 1.9.7 axios: 1.12.2 - fuels: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) + fuels: 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0)) uuid: 9.0.1 transitivePeerDependencies: - debug @@ -20517,7 +20376,7 @@ snapshots: browserslist@4.26.2: dependencies: baseline-browser-mapping: 2.8.6 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001745 electron-to-chromium: 1.5.223 node-releases: 2.0.21 update-browserslist-db: 1.1.3(browserslist@4.26.2) @@ -20640,7 +20499,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.6.3 + tslib: 2.8.1 camelcase@5.3.1: {} @@ -20648,12 +20507,12 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001745: {} capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 upper-case-first: 2.0.2 ccount@2.0.1: {} @@ -20727,7 +20586,7 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 char-regex@1.0.2: {} @@ -20991,7 +20850,7 @@ snapshots: constant-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 upper-case: 2.0.2 content-disposition@0.5.4: @@ -21564,7 +21423,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 dotenv-cli@7.4.4: dependencies: @@ -21577,6 +21436,8 @@ snapshots: dotenv@16.4.7: {} + dotenv@17.2.2: {} + dset@3.1.4: {} dunder-proto@1.0.1: @@ -21988,7 +21849,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -22018,7 +21879,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -22033,7 +21894,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -22625,22 +22486,22 @@ snapshots: fsevents@2.3.3: optional: true - fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)): + fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)): dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/math': 0.101.3 - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/recipes': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/script': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)) + '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/recipes': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/script': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) + '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0)) '@fuel-ts/versions': 0.101.3 '@fuels/vm-asm': 0.60.2 bundle-require: 5.1.0(esbuild@0.25.3) @@ -22697,42 +22558,6 @@ snapshots: - supports-color - vitest - fuels@0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)): - dependencies: - '@fuel-ts/abi-coder': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/abi-typegen': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/account': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/address': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/contract': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/crypto': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/errors': 0.101.3 - '@fuel-ts/hasher': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/math': 0.101.3 - '@fuel-ts/program': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/recipes': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/script': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/transactions': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/utils': 0.101.3(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)) - '@fuel-ts/versions': 0.101.3 - '@fuels/vm-asm': 0.60.2 - bundle-require: 5.1.0(esbuild@0.25.3) - chalk: 4.1.2 - chokidar: 3.6.0 - commander: 13.1.0 - esbuild: 0.25.3 - glob: 10.4.5 - handlebars: 4.7.8 - joycon: 3.1.1 - lodash.camelcase: 4.3.0 - portfinder: 1.0.32 - toml: 3.0.0 - uglify-js: 3.19.3 - yup: 1.6.1 - transitivePeerDependencies: - - encoding - - supports-color - - vitest - function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -23190,7 +23015,7 @@ snapshots: header-case@2.0.4: dependencies: capital-case: 1.0.4 - tslib: 2.6.3 + tslib: 2.8.1 help-me@4.2.0: dependencies: @@ -23505,7 +23330,7 @@ snapshots: is-lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 is-map@2.0.3: {} @@ -23586,7 +23411,7 @@ snapshots: is-upper-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 is-weakmap@2.0.2: {} @@ -23736,7 +23561,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0(babel-plugin-macros@3.1.0) @@ -23844,7 +23669,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.18.6)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23869,13 +23694,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.18.6 - ts-node: 10.9.2(@types/node@20.19.17)(typescript@5.4.5) + '@types/node': 20.19.17 + ts-node: 10.9.2(@types/node@22.18.6)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.18.6)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23900,13 +23725,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.18.6 - ts-node: 10.9.2(@types/node@22.18.6)(typescript@5.4.5) + '@types/node': 20.19.17 + ts-node: 10.9.2(@types/node@24.5.2)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@22.18.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.18.6)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23932,7 +23757,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.18.6 - ts-node: 10.9.2(@types/node@24.5.2)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@22.18.6)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23992,7 +23817,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -24002,7 +23827,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.18.6 + '@types/node': 20.19.17 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -24041,7 +23866,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -24076,7 +23901,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -24104,7 +23929,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -24150,7 +23975,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -24169,7 +23994,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.18.6 + '@types/node': 20.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -24178,7 +24003,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.18.6 + '@types/node': 20.19.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -24569,11 +24394,11 @@ snapshots: lower-case-first@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -25522,7 +25347,7 @@ snapshots: '@next/env': 14.2.33 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001745 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -25550,7 +25375,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.13 busboy: 1.6.0 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001745 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -25630,7 +25455,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.8.1 node-addon-api@2.0.2: {} @@ -25903,7 +25728,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -25962,12 +25787,12 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 path-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 path-exists@3.0.0: {} @@ -26888,7 +26713,7 @@ snapshots: sentence-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 upper-case-first: 2.0.2 serialize-error@2.1.0: {} @@ -26914,7 +26739,7 @@ snapshots: serverless-offline@13.9.0(bufferutil@4.0.9)(serverless@3.40.0(@types/node@16.18.126)(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: - '@aws-sdk/client-lambda': 3.895.0 + '@aws-sdk/client-lambda': 3.896.0 '@hapi/boom': 10.0.1 '@hapi/h2o2': 10.0.4 '@hapi/hapi': 21.4.3 @@ -26953,12 +26778,12 @@ snapshots: serverless@3.40.0(@types/node@16.18.126)(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@aws-sdk/client-api-gateway': 3.895.0 - '@aws-sdk/client-cognito-identity-provider': 3.895.0 - '@aws-sdk/client-eventbridge': 3.895.0 - '@aws-sdk/client-iam': 3.895.0 - '@aws-sdk/client-lambda': 3.895.0 - '@aws-sdk/client-s3': 3.895.0 + '@aws-sdk/client-api-gateway': 3.896.0 + '@aws-sdk/client-cognito-identity-provider': 3.896.0 + '@aws-sdk/client-eventbridge': 3.896.0 + '@aws-sdk/client-iam': 3.896.0 + '@aws-sdk/client-lambda': 3.896.0 + '@aws-sdk/client-s3': 3.896.0 '@serverless/dashboard-plugin': 7.2.3(@types/node@16.18.126)(bufferutil@4.0.9)(supports-color@8.1.1)(utf-8-validate@5.0.10) '@serverless/platform-client': 4.5.1(bufferutil@4.0.9)(supports-color@8.1.1)(utf-8-validate@5.0.10) '@serverless/utils': 6.15.0(@types/node@16.18.126) @@ -27055,7 +26880,7 @@ snapshots: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - to-buffer: 1.2.1 + to-buffer: 1.2.2 sharp@0.33.5: dependencies: @@ -27184,7 +27009,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 socket.io-client@4.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: @@ -27281,7 +27106,7 @@ snapshots: sponge-case@1.0.1: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 sprintf-js@1.0.3: {} @@ -27575,7 +27400,7 @@ snapshots: swap-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 swiper@11.2.10: {} @@ -27600,7 +27425,7 @@ snapshots: end-of-stream: 1.4.5 fs-constants: 1.0.0 readable-stream: 2.3.8 - to-buffer: 1.2.1 + to-buffer: 1.2.2 xtend: 4.0.2 tar-stream@2.2.0: @@ -27697,7 +27522,7 @@ snapshots: title-case@3.0.3: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 title@3.5.3: dependencies: @@ -27710,7 +27535,7 @@ snapshots: tmpl@1.0.5: {} - to-buffer@1.2.1: + to-buffer@1.2.2: dependencies: isarray: 2.0.5 safe-buffer: 5.2.1 @@ -28322,11 +28147,11 @@ snapshots: upper-case-first@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 upper-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 uri-js@4.4.1: dependencies: @@ -28509,31 +28334,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@20.19.17): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@8.1.1) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 5.4.20(@types/node@20.19.17) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite-node@3.2.4(@types/node@24.5.2): + vite-node@3.2.4(@types/node@20.19.17)(terser@5.44.0): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) + vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - less @@ -28563,7 +28370,7 @@ snapshots: - supports-color - terser - vite@5.4.20(@types/node@20.19.17): + vite@5.4.20(@types/node@20.19.17)(terser@5.44.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -28571,6 +28378,7 @@ snapshots: optionalDependencies: '@types/node': 20.19.17 fsevents: 2.3.3 + terser: 5.44.0 vite@5.4.20(@types/node@24.5.2)(terser@5.44.0): dependencies: @@ -28598,14 +28406,14 @@ snapshots: tsx: 4.20.5 yaml: 2.8.1 - vitepress@1.0.0-rc.41(@algolia/client-search@5.38.0)(@types/node@24.5.2)(@types/react@18.3.24)(axios@1.12.2)(change-case@4.1.2)(idb-keyval@6.2.2)(jwt-decode@3.1.2)(postcss@8.5.6)(qrcode@1.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.4.5): + vitepress@1.0.0-rc.41(@algolia/client-search@5.38.0)(@types/node@24.5.2)(@types/react@18.3.24)(axios@1.12.2)(change-case@4.1.2)(idb-keyval@6.2.2)(jwt-decode@3.1.2)(postcss@8.5.6)(qrcode@1.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.0)(typescript@5.4.5): dependencies: '@docsearch/css': 3.9.0 '@docsearch/js': 3.9.0(@algolia/client-search@5.38.0)(@types/react@18.3.24)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@shikijs/core': 1.29.2 '@shikijs/transformers': 1.29.2 '@types/markdown-it': 13.0.9 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.20(@types/node@24.5.2))(vue@3.4.21(typescript@5.4.5)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.20(@types/node@24.5.2)(terser@5.44.0))(vue@3.4.21(typescript@5.4.5)) '@vue/devtools-api': 7.7.7 '@vueuse/core': 10.11.1(vue@3.4.21(typescript@5.4.5)) '@vueuse/integrations': 10.11.1(axios@1.12.2)(change-case@4.1.2)(focus-trap@7.6.5)(idb-keyval@6.2.2)(jwt-decode@3.1.2)(qrcode@1.5.3)(vue@3.4.21(typescript@5.4.5)) @@ -28645,11 +28453,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(terser@5.44.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.20(@types/node@20.19.17)) + '@vitest/mocker': 3.2.4(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -28667,8 +28475,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.20(@types/node@20.19.17) - vite-node: 3.2.4(@types/node@20.19.17) + vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) + vite-node: 3.2.4(@types/node@20.19.17)(terser@5.44.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -28684,45 +28492,6 @@ snapshots: - supports-color - terser - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.20(@types/node@24.5.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.2.2 - magic-string: 0.30.19 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 5.4.20(@types/node@24.5.2)(terser@5.44.0) - vite-node: 3.2.4(@types/node@24.5.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.5.2 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(terser@5.44.0): dependencies: '@types/chai': 5.2.2 diff --git a/turbo.json b/turbo.json index 65642aa6..e51e1b9d 100644 --- a/turbo.json +++ b/turbo.json @@ -6,7 +6,7 @@ "cache": true }, "build": { - "dependsOn": ["codegen:sdk", "^build"], + "dependsOn": ["^build"], "outputs": ["dist/**", ".next/**"], "env": [ "API_URL", @@ -33,6 +33,13 @@ "outputLogs": "new-only", "cache": false }, + "test:e2e": { + "dependsOn": ["@bako-id/server#build", "@bako-id/ui#build"], + "passThroughEnv": [ + "PLAYWRIGHT_*", + "TEST_WALLET_PRIVATE_KEY" + ] + }, "codegen:sdk": { "env": ["GRAPHQL_API_URL"], "outputs": ["src/generated/**/*.ts"],