Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/scan/src/app/(app)/_hooks/x402/evm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useX402Fetch } from './use-fetch';
import {
x402Client,
wrapFetchWithPayment,
registerExactEvmScheme,
registerEvmSchemes,
toEvmSigner,
} from '@/lib/x402/wrap-fetch';

Expand All @@ -26,7 +26,7 @@ export const useEvmPaymentWrapper = (chain: Chain) => {
const signer = toEvmSigner(
walletClient as Parameters<typeof toEvmSigner>[0]
);
registerExactEvmScheme(client, { signer });
registerEvmSchemes(client, { signer });

return wrapFetchWithPayment(baseFetch, client);
};
Expand Down
31 changes: 31 additions & 0 deletions apps/scan/src/lib/x402/wrap-fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
*/
import type { x402Client as X402Client } from '@x402/core/client';
import type { ClientSvmSigner } from '@x402/svm';
import { AuthCaptureEvmScheme } from '@x402/evm/auth-capture/client';
import { registerExactEvmScheme } from '@x402/evm/exact/client';
import { UptoEvmScheme } from '@x402/evm/upto/client';
import { x402Client, wrapFetchWithPayment } from '@x402/fetch';
import { ExactSvmScheme } from '@x402/svm/exact/client';
import { ExactSvmSchemeV1 } from '@x402/svm/exact/v1/client';
Expand Down Expand Up @@ -51,6 +53,35 @@ export function toEvmSigner(walletClient: {
};
}

/**
* Register every single-shot EVM client scheme on a client.
*
* - `exact` — direct ERC-3009 / Permit2 transfer.
* - `upto` — variable-amount (metered) payment up to a cap.
* - `auth-capture` — escrow-backed authorize/capture used by x402r
* refundable endpoints; signs ERC-3009 (default) or Permit2
* (`assetTransferMethod: "permit2"`).
*
* All three are stateless and take the same `ClientEvmSigner`, so one signer
* wires up every path. Registering a scheme an endpoint doesn't use is
* harmless — the client matches on the `scheme` of each `accepts` entry.
*
* `batch-settlement` is intentionally omitted: it is stateful (per-channel
* deposits, vouchers, on-chain channel recovery) and needs persistent client
* channel storage. The wallet builds a fresh per-request `x402Client`, so the
* scheme's default in-memory storage would silently lose channel state
* between requests. Wiring it up correctly is separate work.
*/
export function registerEvmSchemes(
client: X402Client,
{ signer }: { signer: ClientEvmSigner }
): X402Client {
registerExactEvmScheme(client, { signer });
client.register('eip155:*', new UptoEvmScheme(signer));
client.register('eip155:*', new AuthCaptureEvmScheme(signer));
return client;
}

export function registerSvmX402Client(params: {
signer: ClientSvmSigner;
rpcUrl: string;
Expand Down
4 changes: 2 additions & 2 deletions apps/scan/src/trpc/routers/user/server-wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { Chain, SUPPORTED_CHAINS } from '@/types/chain';
import {
x402Client,
wrapFetchWithPayment,
registerExactEvmScheme,
registerEvmSchemes,
registerSvmX402Client,
} from '@/lib/x402/wrap-fetch';
import { env } from '@/env';
Expand Down Expand Up @@ -161,7 +161,7 @@ export const serverWalletRouter = createTRPCRouter({
});
} else {
client = new x402Client();
registerExactEvmScheme(client, {
registerEvmSchemes(client, {
signer: signer as ClientEvmSigner,
});
}
Expand Down
109 changes: 54 additions & 55 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ catalogs:
'x402-express': *X402_VERSION
'x402-hono': *X402_VERSION
x402:
'@x402/core': &X402_CORE_VERSION ^2.11.0
'@x402/core': &X402_CORE_VERSION ^2.14.0
'@x402/evm': *X402_CORE_VERSION
'@x402/extensions': *X402_CORE_VERSION
'@x402/fetch': *X402_CORE_VERSION
Expand Down