diff --git a/.github/workflows/test-fee-payer.yml b/.github/workflows/test-fee-payer.yml index bfcc9df20..09d689e21 100644 --- a/.github/workflows/test-fee-payer.yml +++ b/.github/workflows/test-fee-payer.yml @@ -18,7 +18,6 @@ concurrency: env: NODE_OPTIONS: '--disable-warning=ExperimentalWarning --disable-warning=DeprecationWarning' TEMPO_ENV: localnet - TEMPO_TAG: latest jobs: test: @@ -35,6 +34,5 @@ jobs: uses: ./.github/actions/install-dependencies - name: Run tests - # TODO(struong): use prool instance once Moderato hardfork lands - run: pnpm test:testnet + run: pnpm test working-directory: apps/fee-payer diff --git a/apps/fee-payer/package.json b/apps/fee-payer/package.json index 672b83d4f..aa646dfe2 100644 --- a/apps/fee-payer/package.json +++ b/apps/fee-payer/package.json @@ -32,6 +32,7 @@ "@cloudflare/vitest-pool-workers": "catalog:", "@cloudflare/workers-types": "catalog:", "@types/node": "catalog:", + "dotenv": "catalog:", "prool": "catalog:", "testcontainers": "catalog:", "typescript": "catalog:", diff --git a/apps/fee-payer/test/prool.ts b/apps/fee-payer/test/prool.ts index be979b801..32d9464ee 100644 --- a/apps/fee-payer/test/prool.ts +++ b/apps/fee-payer/test/prool.ts @@ -3,16 +3,7 @@ import * as TestContainers from 'prool/testcontainers' export const port = 9545 -export const rpcUrl = (() => { - if (process.env.TEMPO_ENV === 'testnet') - return 'https://rpc.testnet.tempo.xyz' - // Localnet - use pool ID for parallel test isolation - const poolId = Number(process.env.VITEST_POOL_ID ?? 1) - return `http://localhost:${port}/${poolId}` -})() - -export async function createServer() { - const tag = process.env.TEMPO_TAG ?? 'latest' +export async function createServer(tag = 'latest') { return Server.create({ instance: TestContainers.Instance.tempo({ blockTime: '2ms', diff --git a/apps/fee-payer/test/setup.global.ts b/apps/fee-payer/test/setup.global.ts index 197f0f56b..b3a58fcc3 100644 --- a/apps/fee-payer/test/setup.global.ts +++ b/apps/fee-payer/test/setup.global.ts @@ -1,6 +1,17 @@ +import { createPublicClient, http } from 'viem' +import { tempoTestnet } from 'viem/chains' import { createServer, port } from './prool.js' -const tempoEnv = (process.env.TEMPO_ENV ?? 'localnet') as string +async function getCurrentTempoTestnetTag(): Promise { + const client = createPublicClient({ + chain: tempoTestnet, + transport: http(), + }) + const clientVersion = await client.request({ method: 'web3_clientVersion' }) + // clientVersion format: "tempo/v0.8.0-6318f1a/x86_64-unknown-linux-gnu" + const sha = clientVersion.split('/')[1].split('-').pop() + return `sha-${sha}` +} async function waitForTempo(maxRetries = 10, delayMs = 500): Promise { const url = `http://localhost:${port}/1` @@ -30,11 +41,16 @@ async function waitForTempo(maxRetries = 10, delayMs = 500): Promise { } export default async function globalSetup() { - if (tempoEnv !== 'localnet') return + if ((import.meta.env.TEMPO_ENV ?? 'localnet') !== 'localnet') return + + const tempoTag = (import.meta.env.TEMPO_TAG ?? + (await getCurrentTempoTestnetTag())) as string - console.log('[globalSetup] Starting local Tempo via Prool...') + console.log('[globalSetup] Starting local Tempo via Prool...', { + tempoTag, + }) try { - const server = await createServer() + const server = await createServer(tempoTag) console.log('[globalSetup] Server created, starting...') const teardown = await server.start() console.log( diff --git a/apps/fee-payer/vitest.config.ts b/apps/fee-payer/vitest.config.ts index 50019a144..e830ab6eb 100644 --- a/apps/fee-payer/vitest.config.ts +++ b/apps/fee-payer/vitest.config.ts @@ -1,6 +1,7 @@ import { join } from 'node:path' import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config' import { Mnemonic } from 'ox' +import 'dotenv/config' const tempoEnv = process.env.TEMPO_ENV ?? 'localnet' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2b206926..f48376bf8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,6 +102,9 @@ catalogs: cva: specifier: ^1.0.0-beta.4 version: 1.0.0-beta.4 + dotenv: + specifier: ^17.2.3 + version: 17.2.3 eruda: specifier: ^3.4.3 version: 3.4.3 @@ -458,6 +461,9 @@ importers: '@types/node': specifier: 'catalog:' version: 25.0.3 + dotenv: + specifier: 'catalog:' + version: 17.2.3 prool: specifier: 'catalog:' version: 0.2.2(testcontainers@11.11.0) @@ -3604,6 +3610,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + drizzle-kit@0.31.8: resolution: {integrity: sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==} hasBin: true @@ -8809,6 +8819,8 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dotenv@17.2.3: {} + drizzle-kit@0.31.8: dependencies: '@drizzle-team/brocli': 0.10.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 163804efd..cb5c7aee0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,11 +2,6 @@ packages: - apps/** - '!**/_/**' -shellEmulator: true -workspaceConcurrency: -1 -enablePrePostScripts: true -nodeOptions: '--disable-warning=ExperimentalWarning --disable-warning=DeprecationWarning' - catalog: '@biomejs/biome': ^2.3.10 '@cloudflare/puppeteer': ^1.0.4 @@ -40,6 +35,7 @@ catalog: '@vitejs/plugin-react': ^5.1.2 abitype: ^1.2.3 cva: ^1.0.0-beta.4 + dotenv: ^17.2.3 eruda: ^3.4.3 esbuild: ^0.27.2 globals: ^16.5.0 @@ -54,8 +50,8 @@ catalog: shiki: ^3.20.0 tailwind-merge: ^3.4.0 tailwindcss: ^4.1.18 - testcontainers: ^11.11.0 tempo.ts: ^0.12.1 + testcontainers: ^11.11.0 tw-animate-css: ^1.4.0 typed-query-selector: ^2.12.0 typescript: ^5.9.3 @@ -69,3 +65,11 @@ catalog: zod: ^4.3.4 catalogMode: strict + +enablePrePostScripts: true + +nodeOptions: '--disable-warning=ExperimentalWarning --disable-warning=DeprecationWarning' + +shellEmulator: true + +workspaceConcurrency: -1