();
+ const warpCore = useWarpCore();
+ const originToken = routeOverrideToken || getTokenByIndex(warpCore, values.tokenIndex);
+ const isPruvOrigin = values.origin?.toLowerCase().startsWith('pruv');
+
+ const { isLoading: isQuoteLoading, fees } = useFeeQuotes(values, true);
+ const feePreview = useMemo(
+ () => formatFeePreview(originToken, fees ?? null),
+ [originToken, fees],
+ );
+
+ if (!isPruvOrigin) return null;
+
+ return
;
+}
+
function ReviewDetails({
visible,
routeOverrideToken,
@@ -712,7 +737,7 @@ function ReviewDetails({
amountWei,
visible,
);
- const { isLoading: isQuoteLoading, fees } = useFeeQuotes(values, visible);
+ const { isLoading: isQuoteLoading, fees } = useFeeQuotes(values, true);
// Check if USDC bridge fee approval is needed (for non-USDC tokens from pruv)
const { isLoading: isUSDCApproveLoading, isUSDCApproveRequired } =
@@ -729,10 +754,11 @@ function ReviewDetails({
const totalApprovals = (isApproveRequired ? 1 : 0) + (needAdditionalUSDCApproval ? 1 : 0);
const receivedAmount = amount;
- const interchainQuote =
- originToken && objKeys(chainsRentEstimate).includes(originToken.chainName)
- ? fees?.interchainQuote.plus(chainsRentEstimate[originToken.chainName])
- : fees?.interchainQuote;
+ const feePreview = useMemo(
+ () => formatFeePreview(originToken, fees ?? null),
+ [originToken, fees],
+ );
+ const interchainQuote = feePreview?.interchainQuote;
return (
{`${scaledAmount.value} ${originTokenSymbol} (scaled from ${scaledAmount.originScale} to ${scaledAmount.destinationScale})`}
)}
- {fees?.localQuote && fees.localQuote.amount > 0n && (
+ {feePreview?.localQuote && feePreview.localQuote.amount > 0n && (
Local Gas (est.)
- {`${fees.localQuote.getDecimalFormattedAmount().toFixed(4) || '0'} ${
- fees.localQuote.token.symbol || ''
+ {`${feePreview.localQuote.getDecimalFormattedAmount().toFixed(4) || '0'} ${
+ feePreview.localQuote.token.symbol || ''
}`}
)}
@@ -877,6 +903,52 @@ function useFormInitialValues(): TransferFormValues {
}, [warpCore, destinationQuery, originQuery, tokenIndex, defaultOriginToken]);
}
+function formatFeePreview(
+ originToken: Token | null | undefined,
+ feeQuotes: { interchainQuote: TokenAmount; localQuote: TokenAmount } | null,
+) {
+ if (!feeQuotes) return null;
+
+ const interchainQuoteWithRent =
+ originToken && objKeys(chainsRentEstimate).includes(originToken.chainName)
+ ? feeQuotes.interchainQuote.plus(chainsRentEstimate[originToken.chainName])
+ : feeQuotes.interchainQuote;
+
+ const amountsToGroup = [interchainQuoteWithRent, feeQuotes.localQuote].filter(
+ (amount) => amount && amount.amount > 0n,
+ ) as TokenAmount[];
+
+ if (!amountsToGroup.length) return null;
+
+ const groupedFees: TokenAmount[] = [];
+
+ for (const tokenAmount of amountsToGroup) {
+ let merged = false;
+
+ for (let i = 0; i < groupedFees.length; i++) {
+ if (tokenAmount.token.isFungibleWith(groupedFees[i].token)) {
+ groupedFees[i] = groupedFees[i].plus(tokenAmount.amount);
+ merged = true;
+ break;
+ }
+ }
+
+ if (!merged) {
+ groupedFees.push(new TokenAmount(tokenAmount.amount, tokenAmount.token));
+ }
+ }
+
+ const totalFees = groupedFees
+ .map((fee) => `${fee.getDecimalFormattedAmount().toFixed(8)} ${fee.token.symbol}`)
+ .join(', ');
+
+ return {
+ ...feeQuotes,
+ interchainQuote: interchainQuoteWithRent,
+ totalFees,
+ };
+}
+
const insufficientFundsErrMsg = /insufficient.[funds|lamports]/i;
const emptyAccountErrMsg = /AccountNotFound/i;
diff --git a/src/features/transfer/__tests__/useFeeQuotes.test.ts b/src/features/transfer/__tests__/useFeeQuotes.test.ts
index 632605840..53a36e95d 100644
--- a/src/features/transfer/__tests__/useFeeQuotes.test.ts
+++ b/src/features/transfer/__tests__/useFeeQuotes.test.ts
@@ -2,16 +2,6 @@ import { IToken, TokenAmount } from '@hyperlane-xyz/sdk';
import { renderHook } from '@testing-library/react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
-// Mock dependencies
-vi.mock('@hyperlane-xyz/widgets', () => ({
- useAccounts: vi.fn(),
- getAccountAddressAndPubKey: vi.fn(),
-}));
-
-vi.mock('../../chains/hooks', () => ({
- useMultiProvider: vi.fn(),
-}));
-
vi.mock('../../tokens/hooks', () => ({
useWarpCore: vi.fn(),
getTokenByIndex: vi.fn(),
@@ -27,34 +17,23 @@ vi.mock('../../../utils/logger', () => ({
},
}));
-import { getAccountAddressAndPubKey, useAccounts } from '@hyperlane-xyz/widgets';
import { useQuery } from '@tanstack/react-query';
-import { useMultiProvider } from '../../chains/hooks';
import { getTokenByIndex, useWarpCore } from '../../tokens/hooks';
import { TransferFormValues } from '../types';
import { useFeeQuotes } from '../useFeeQuotes';
describe('useFeeQuotes', () => {
- const mockMultiProvider = { getChainName: vi.fn() };
const mockWarpCore = {
- estimateTransferRemoteFees: vi.fn(),
+ tokens: [],
+ multiProvider: { getChainMetadata: vi.fn() },
};
- const mockAccounts = [{ address: '0x123' }];
- const mockSender = '0x123';
- const mockSenderPubKey = Promise.resolve('0xpubkey');
const mockToken = { symbol: 'USDC', decimals: 6 } as IToken;
const mockInterchainQuote = new TokenAmount(100n, mockToken);
const mockLocalQuote = new TokenAmount(50n, mockToken);
beforeEach(() => {
vi.clearAllMocks();
- (useMultiProvider as any).mockReturnValue(mockMultiProvider);
(useWarpCore as any).mockReturnValue(mockWarpCore);
- (useAccounts as any).mockReturnValue({ accounts: mockAccounts });
- (getAccountAddressAndPubKey as any).mockReturnValue({
- address: mockSender,
- publicKey: mockSenderPubKey,
- });
(getTokenByIndex as any).mockReturnValue(mockToken);
});
@@ -105,7 +84,7 @@ describe('useFeeQuotes', () => {
expect(useQuery).toHaveBeenCalledWith(
expect.objectContaining({
- queryKey: ['useFeeQuotes', 'polygon', 0, mockSender, mockSenderPubKey],
+ queryKey: ['useFeeQuotes', 'ethereum', 'polygon', 0],
queryFn: expect.any(Function),
enabled: true,
refetchInterval: 15_000,
@@ -236,33 +215,6 @@ describe('useFeeQuotes', () => {
expect(result.current.fees).toBeNull();
});
- it('should call getAccountAddressAndPubKey with correct parameters', () => {
- (useQuery as any).mockReturnValue({
- isLoading: false,
- isError: false,
- data: null,
- });
-
- renderHook(() =>
- useFeeQuotes(
- {
- origin: 'ethereum',
- destination: 'polygon',
- tokenIndex: 0,
- amount: '100',
- recipient: '0x123',
- },
- true,
- ),
- );
-
- expect(getAccountAddressAndPubKey).toHaveBeenCalledWith(
- mockMultiProvider,
- 'ethereum',
- mockAccounts,
- );
- });
-
it('should use correct refetch interval', () => {
(useQuery as any).mockReturnValue({
isLoading: false,
@@ -317,7 +269,7 @@ describe('useFeeQuotes', () => {
expect(useQuery).toHaveBeenCalledTimes(2);
expect(useQuery).toHaveBeenLastCalledWith(
expect.objectContaining({
- queryKey: ['useFeeQuotes', 'arbitrum', 1, mockSender, mockSenderPubKey],
+ queryKey: ['useFeeQuotes', 'ethereum', 'arbitrum', 1],
}),
);
});
diff --git a/src/features/transfer/useFeeQuotes.ts b/src/features/transfer/useFeeQuotes.ts
index a18be79ec..d3fdaf4f1 100644
--- a/src/features/transfer/useFeeQuotes.ts
+++ b/src/features/transfer/useFeeQuotes.ts
@@ -1,54 +1,93 @@
-import { TokenAmount, WarpCore } from '@hyperlane-xyz/sdk';
-import { HexString } from '@hyperlane-xyz/utils';
-import { getAccountAddressAndPubKey, useAccounts } from '@hyperlane-xyz/widgets';
+import { Token, TokenAmount, WarpCore } from '@hyperlane-xyz/sdk';
import { useQuery } from '@tanstack/react-query';
+import BigNumber from 'bignumber.js';
+import { config } from '../../consts/config';
import { logger } from '../../utils/logger';
-import { useMultiProvider } from '../chains/hooks';
import { getTokenByIndex, useWarpCore } from '../tokens/hooks';
import { TransferFormValues } from './types';
-const FEE_QUOTE_REFRESH_INTERVAL = 15_000; // 10s
+const FEE_QUOTE_REFRESH_INTERVAL = 15_000; // 15s
export function useFeeQuotes(
{ origin, destination, tokenIndex }: TransferFormValues,
enabled: boolean,
) {
- const multiProvider = useMultiProvider();
const warpCore = useWarpCore();
- const { accounts } = useAccounts(multiProvider);
- const { address: sender, publicKey: senderPubKey } = getAccountAddressAndPubKey(
- multiProvider,
- origin,
- accounts,
- );
-
- const { isLoading, isError, data } = useQuery({
+ const shouldFetch = enabled && !!destination && typeof tokenIndex === 'number';
+ const { isLoading, isError, data, isFetching } = useQuery({
// The WarpCore class is not serializable, so we can't use it as a key
// eslint-disable-next-line @tanstack/query/exhaustive-deps
- queryKey: ['useFeeQuotes', destination, tokenIndex, sender, senderPubKey],
- queryFn: () => fetchFeeQuotes(warpCore, destination, tokenIndex, sender, senderPubKey),
- enabled,
+ queryKey: ['useFeeQuotes', origin, destination, tokenIndex],
+ queryFn: () => fetchFeeQuotes(warpCore, destination, tokenIndex),
+ enabled: shouldFetch,
refetchInterval: FEE_QUOTE_REFRESH_INTERVAL,
});
- return { isLoading, isError, fees: data };
+ return { isLoading: isLoading || isFetching, isError, fees: data };
}
export async function fetchFeeQuotes(
warpCore: WarpCore,
destination?: ChainName,
tokenIndex?: number,
- sender?: Address,
- senderPubKey?: Promise
,
): Promise<{ interchainQuote: TokenAmount; localQuote: TokenAmount } | null> {
const originToken = getTokenByIndex(warpCore, tokenIndex);
- if (!destination || !sender || !originToken) return null;
- logger.debug('Fetching fee quotes');
- return warpCore.estimateTransferRemoteFees({
- originToken,
- destination,
- sender,
- senderPubKey: await senderPubKey,
- });
+ if (!destination || !originToken) return null;
+
+ logger.debug('Calculating custom fee quotes');
+ const localQuote = getLocalGasQuote(warpCore, originToken);
+ const interchainQuote =
+ getCustomInterchainQuote(warpCore, originToken.chainName, destination) || originToken.amount(0);
+
+ return {
+ interchainQuote,
+ localQuote,
+ };
+}
+
+function getLocalGasQuote(warpCore: WarpCore, originToken: Token): TokenAmount {
+ try {
+ const chainMetadata = warpCore.multiProvider.getChainMetadata(originToken.chainName);
+ const nativeToken = Token.FromChainMetadataNativeToken(chainMetadata);
+ return nativeToken.amount(0);
+ } catch {
+ return originToken.amount(0);
+ }
+}
+
+function getCustomInterchainQuote(
+ warpCore: WarpCore,
+ originChain: ChainName,
+ destination: ChainName,
+): TokenAmount | null {
+ const pruvQuote = getPruvBridgeFeeQuote(warpCore, originChain, destination);
+ if (pruvQuote) return pruvQuote;
+ return null;
+}
+
+function getPruvBridgeFeeQuote(
+ warpCore: WarpCore,
+ originChain: ChainName,
+ destination: ChainName,
+): TokenAmount | null {
+ if (!config.enablePruvOriginFeeUSDC) return null;
+ if (!originChain?.toLowerCase().startsWith('pruv')) return null;
+ const feeValue = config.pruvOriginFeeUSDC[destination];
+ if (!feeValue) return null;
+
+ const usdcToken =
+ warpCore.tokens.find(
+ (token) => token.chainName === originChain && token.symbol.toUpperCase() === 'USDC',
+ ) || null;
+
+ if (!usdcToken) return null;
+
+ const scaledAmount = new BigNumber(feeValue)
+ .shiftedBy(usdcToken.decimals)
+ .integerValue(BigNumber.ROUND_FLOOR);
+
+ if (!scaledAmount.isFinite() || scaledAmount.lte(0)) return null;
+
+ return usdcToken.amount(scaledAmount.toFixed(0));
}
From 9b13221f131ffcf13afe8a3e1a4d2f5387252256 Mon Sep 17 00:00:00 2001
From: Raihan Nismara
Date: Mon, 23 Mar 2026 11:11:23 +0700
Subject: [PATCH 04/14] feat: estimate gas preview
---
src/features/transfer/TransferTokenForm.tsx | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/features/transfer/TransferTokenForm.tsx b/src/features/transfer/TransferTokenForm.tsx
index 1f96ec952..abde95640 100644
--- a/src/features/transfer/TransferTokenForm.tsx
+++ b/src/features/transfer/TransferTokenForm.tsx
@@ -669,14 +669,20 @@ function FeePreviewSection({
const warpCore = useWarpCore();
const originToken = routeOverrideToken || getTokenByIndex(warpCore, values.tokenIndex);
const isPruvOrigin = values.origin?.toLowerCase().startsWith('pruv');
-
- const { isLoading: isQuoteLoading, fees } = useFeeQuotes(values, true);
+ const hasRequiredInputs =
+ !!originToken &&
+ !!values.recipient &&
+ !!values.amount &&
+ !Number.isNaN(Number(values.amount)) &&
+ Number(values.amount) > 0;
+
+ const { isLoading: isQuoteLoading, fees } = useFeeQuotes(values, hasRequiredInputs);
const feePreview = useMemo(
() => formatFeePreview(originToken, fees ?? null),
[originToken, fees],
);
- if (!isPruvOrigin) return null;
+ if (!isPruvOrigin || !hasRequiredInputs) return null;
return ;
}
From 7bc4298c68f8649a11309fdd00c5b8ede6fe7f93 Mon Sep 17 00:00:00 2001
From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com>
Date: Mon, 15 Dec 2025 14:28:45 +0000
Subject: [PATCH 05/14] feat!: pnpm migration (#840)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Migrate package manager from Yarn 4.x (Berry) to pnpm 10.x, following
the patterns established in the monorepo migration
([hyperlane-monorepo#7410](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/7410)).
**Changes:**
- Update `packageManager` to pnpm@10.25.0
- Convert `resolutions` to `pnpm.overrides`
- Convert yarn patches to `pnpm.patchedDependencies` format
- Pin dependency versions to match yarn.lock (pnpm re-resolves `^`
ranges to latest):
- `@cosmos-kit/react`: 2.18.0
- `@solana/wallet-adapter-wallets`: 0.19.16
- `@rainbow-me/rainbowkit`: 2.2.0
- Add phantom dependencies required by pnpm strict dependency isolation
- Update CI workflows to use pnpm (pnpm/action-setup@v4, pnpm store
caching)
- Update GitHub Actions to latest versions (checkout@v6, setup-node@v6)
- Update vercel.json to use pnpm@10.25.0
- Update README with pnpm commands
- Remove yarn files (.yarn/, .yarnrc.yml, yarn.lock)
- Add pnpm-lock.yaml
- Fix unit testing
- Update husky
- [x] `pnpm install` succeeds
- [x] `pnpm typecheck` passes
- [x] `pnpm build` succeeds
- [x] `pnpm lint` passes
- [x] CI workflows pass
🤖 Generated with [Claude Code](https://claude.com/claude-code)
* **New Features**
* Added support for Solana wallet integrations, Sentry error monitoring,
and additional Chakra UI packages.
* **Chores**
* Migrated project tooling, package manager metadata, and CI workflows
from Yarn to pnpm; updated GitHub Actions and dev tooling versions.
* Upgraded and added multiple dependencies and devDependencies; replaced
resolution/patch approach with pnpm-compatible overrides.
* **Documentation**
* Updated CLI/README commands and ignore lists to reflect pnpm usage.
✏️ Tip: You can customize this high-level summary in your review
settings.
---------
Co-authored-by: Claude Opus 4.5
---
.github/workflows/ci.yml | 146 +-
.gitignore | 7 +-
.husky/pre-commit | 7 +-
.prettierignore | 3 +-
.yarn/install-state.gz | Bin 0 -> 3331225 bytes
.yarn/plugins/@yarnpkg/plugin-outdated.cjs | 33 -
.yarn/releases/yarn-4.12.0.cjs | 942 -
.yarnrc.yml | 13 -
README.md | 67 +-
package.json | 169 +-
.../starknetkit@2.6.1.patch | 0
pnpm-lock.yaml | 29036 +++++++++++++++
src/components/errors/ErrorBoundary.tsx | 3 +-
src/features/chains/rpcUtils.ts | 2 +-
src/features/tokens/approval.ts | 5 +-
src/features/tokens/balances.ts | 4 +-
src/features/transfer/useFeeQuotes.ts | 4 +-
yarn.lock | 29641 ----------------
18 files changed, 29291 insertions(+), 30791 deletions(-)
create mode 100644 .yarn/install-state.gz
delete mode 100644 .yarn/plugins/@yarnpkg/plugin-outdated.cjs
delete mode 100755 .yarn/releases/yarn-4.12.0.cjs
delete mode 100644 .yarnrc.yml
rename .yarn/patches/starknetkit-npm-2.6.1-61cd76646d.patch => patches/starknetkit@2.6.1.patch (100%)
create mode 100644 pnpm-lock.yaml
delete mode 100644 yarn.lock
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3e96b6a97..9889f724d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,18 +15,28 @@ jobs:
install:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/cache@v3
+ - uses: actions/checkout@v6
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v6
with:
- path: |
- **/node_modules
- .yarn/cache
- key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }}
- - name: yarn-install
- # Check out the lockfile from main, reinstall, and then
- # verify the lockfile matches what was committed.
+ node-version-file: 'package.json'
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ shell: bash
+ run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: pnpm-install
run: |
- yarn install
+ pnpm install --frozen-lockfile
CHANGES=$(git status -s)
if [[ ! -z $CHANGES ]]; then
echo "Changes found: $CHANGES"
@@ -38,15 +48,30 @@ jobs:
runs-on: ubuntu-latest
needs: [install]
steps:
- - uses: actions/checkout@v3
- - uses: actions/cache@v3
+ - uses: actions/checkout@v6
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v6
+ with:
+ node-version-file: 'package.json'
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ shell: bash
+ run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
with:
- path: |
- **/node_modules
- .yarn/cache
- key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }}
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
- name: build
- run: yarn run build
+ run: pnpm run build
env:
NEXT_PUBLIC_WALLET_CONNECT_ID: ${{ secrets.NEXT_PUBLIC_WALLET_CONNECT_ID }}
@@ -54,16 +79,31 @@ jobs:
runs-on: ubuntu-latest
needs: [install]
steps:
- - uses: actions/checkout@v3
- - uses: actions/cache@v3
+ - uses: actions/checkout@v6
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v6
+ with:
+ node-version-file: 'package.json'
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ shell: bash
+ run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
with:
- path: |
- **/node_modules
- .yarn/cache
- key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }}
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
- name: prettier
run: |
- yarn run prettier
+ pnpm run prettier
CHANGES=$(git status -s)
if [[ ! -z $CHANGES ]]; then
echo "Changes found: $CHANGES"
@@ -74,26 +114,56 @@ jobs:
runs-on: ubuntu-latest
needs: [install]
steps:
- - uses: actions/checkout@v3
- - uses: actions/cache@v3
+ - uses: actions/checkout@v6
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v6
+ with:
+ node-version-file: 'package.json'
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ shell: bash
+ run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
with:
- path: |
- **/node_modules
- .yarn/cache
- key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }}
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
- name: lint
- run: yarn run lint
+ run: pnpm run lint
test:
runs-on: ubuntu-latest
needs: [build]
steps:
- - uses: actions/checkout@v3
- - uses: actions/cache@v3
+ - uses: actions/checkout@v6
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v6
+ with:
+ node-version-file: 'package.json'
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ shell: bash
+ run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
with:
- path: |
- **/node_modules
- .yarn/cache
- key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }}
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
- name: test
- run: yarn run test
+ run: pnpm run test
diff --git a/.gitignore b/.gitignore
index 44720c27f..233064805 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,7 @@
# dependencies
/node_modules
-/.pnp
-.pnp.js
cache/
-.yarn/install-state.gz
+.pnpm-store/
# testing
/coverage
@@ -26,8 +24,6 @@ coverage.json
# debug
npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
.pnpm-debug.log*
# local env files
@@ -41,3 +37,4 @@ yarn-error.log*
*.tsbuildinfo
.idea
+next-env.d.ts
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
index d84d2b3b6..999772c2c 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,4 +1,3 @@
-yarn run prettier
-yarn run lint
-yarn run typecheck
-yarn run lint-staged
+pnpm run prettier
+pnpm run lint
+pnpm run typecheck
diff --git a/.prettierignore b/.prettierignore
index f64db019b..0165df634 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,2 +1,3 @@
test/outputs
-public
\ No newline at end of file
+public
+LICENSE.md
\ No newline at end of file
diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz
new file mode 100644
index 0000000000000000000000000000000000000000..cfa4623f85023220614a85469e3b85c39861d104
GIT binary patch
literal 3331225
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