@dexterai/x402 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,43 +5,44 @@
5
5
  <h1 align="center">@dexterai/x402</h1>
6
6
 
7
7
  <p align="center">
8
- <strong>The x402 SDK that actually works.</strong>
8
+ <strong>x402 payments for Solana and Base. Works with Phantom.</strong>
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/@dexterai/x402"><img src="https://img.shields.io/npm/v/@dexterai/x402.svg" alt="npm"></a>
13
13
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E=18-brightgreen.svg" alt="Node"></a>
14
- <a href="https://dexter.cash/sdk"><img src="https://img.shields.io/badge/🎮_Live_Demo-dexter.cash%2Fsdk-blueviolet" alt="Live Demo"></a>
14
+ <a href="https://dexter.cash/sdk"><img src="https://img.shields.io/badge/Live_Demo-dexter.cash%2Fsdk-blueviolet" alt="Live Demo"></a>
15
15
  </p>
16
16
 
17
17
  <p align="center">
18
- <a href="https://dexter.cash/sdk"><strong>👉 Try it with real payments →</strong></a>
18
+ <a href="https://dexter.cash/sdk"><strong>Try it with real payments →</strong></a>
19
19
  </p>
20
20
 
21
21
  ---
22
22
 
23
- ## Why This SDK?
23
+ ## What is x402?
24
24
 
25
- - **🔗 Multi-chain** Solana and Base, same API
26
- - **⚡ x402 v2** — Full protocol support, verified working
27
- - **⚛️ React Hook** `useX402Payment` with loading states, balances, and transaction tracking
28
- - **💰 Smart Balance Check** — Clear "insufficient funds" error *before* the wallet popup
29
- - **👻 Phantom Compatible** — Handles Lighthouse safety assertions automatically
30
- - **📦 Zero Config** — Wrap `fetch()`, payments just work
25
+ x402 is a protocol for HTTP-native micropayments. When a server returns HTTP status `402 Payment Required`, it includes payment details in a `PAYMENT-REQUIRED` header. The client signs a payment transaction and retries the request with a `PAYMENT-SIGNATURE` header. The server verifies and settles the payment, then returns the protected content.
26
+
27
+ This SDK handles the entire flow automatically—you just call `fetch()` and payments happen transparently.
31
28
 
32
29
  ---
33
30
 
34
- ## 🎮 See It Working
31
+ ## Why This SDK?
32
+
33
+ **Phantom wallet support on Solana mainnet.** The Dexter facilitator is the only x402 facilitator that handles Phantom's Lighthouse safety assertions. Other facilitators fail silently or reject Phantom transactions on mainnet. This SDK uses the Dexter facilitator by default.
35
34
 
36
- **Don't take our word for it.** Make a real payment yourself:
35
+ **Multi-chain.** Solana and Base with the same API. Add wallets for both chains and the SDK picks the right one based on what the server accepts.
37
36
 
38
- **[→ dexter.cash/sdk](https://dexter.cash/sdk)**
37
+ **Built-in RPC.** Uses Dexter's RPC proxy by default—no need to configure Helius, QuickNode, or other providers. Just pass your wallet and go.
39
38
 
40
- The demo uses this exact SDK. Solana and Base. Real USDC. Real transactions.
39
+ **Pre-flight balance check.** Shows "Insufficient USDC balance" *before* the wallet popup, not after a failed transaction.
40
+
41
+ **React hook included.** `useX402Payment` with loading states, balances, and transaction tracking.
41
42
 
42
43
  ---
43
44
 
44
- ## 🚀 Quick Start
45
+ ## Quick Start
45
46
 
46
47
  ### Install
47
48
 
@@ -59,16 +60,23 @@ const client = createX402Client({
59
60
  solana: solanaWallet,
60
61
  evm: evmWallet,
61
62
  },
62
- rpcUrls: {
63
- 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': 'https://your-solana-rpc.com',
64
- 'eip155:8453': 'https://your-base-rpc.com',
65
- },
66
63
  });
67
64
 
68
65
  // That's it. 402 responses are handled automatically.
69
66
  const response = await client.fetch('https://api.example.com/protected');
70
67
  ```
71
68
 
69
+ RPC URLs are optional—the SDK uses Dexter's RPC proxy by default. Override if needed:
70
+
71
+ ```typescript
72
+ const client = createX402Client({
73
+ wallets: { solana: solanaWallet },
74
+ rpcUrls: {
75
+ 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': 'https://your-rpc.com',
76
+ },
77
+ });
78
+ ```
79
+
72
80
  ### React
73
81
 
74
82
  ```tsx
@@ -77,7 +85,6 @@ import { useX402Payment } from '@dexterai/x402/react';
77
85
  function PayButton() {
78
86
  const { fetch, isLoading, balances, transactionUrl } = useX402Payment({
79
87
  wallets: { solana: solanaWallet, evm: evmWallet },
80
- rpcUrls: { /* your RPC endpoints */ },
81
88
  });
82
89
 
83
90
  return (
@@ -86,7 +93,7 @@ function PayButton() {
86
93
  <button onClick={() => fetch(url)} disabled={isLoading}>
87
94
  {isLoading ? 'Paying...' : 'Pay'}
88
95
  </button>
89
- {transactionUrl && <a href={transactionUrl}>View Transaction ↗</a>}
96
+ {transactionUrl && <a href={transactionUrl}>View Transaction</a>}
90
97
  </div>
91
98
  );
92
99
  }
@@ -94,18 +101,18 @@ function PayButton() {
94
101
 
95
102
  ---
96
103
 
97
- ## 🌐 Supported Networks
104
+ ## Supported Networks
98
105
 
99
106
  | Network | Identifier | Status |
100
107
  |---------|------------|--------|
101
- | Solana Mainnet | `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` | Verified |
102
- | Base Mainnet | `eip155:8453` | Verified |
108
+ | Solana Mainnet | `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` | Verified |
109
+ | Base Mainnet | `eip155:8453` | Verified |
103
110
 
104
111
  All networks use USDC.
105
112
 
106
113
  ---
107
114
 
108
- ## 📦 Package Exports
115
+ ## Package Exports
109
116
 
110
117
  ```typescript
111
118
  // Client - browser & Node.js
@@ -114,7 +121,7 @@ import { createX402Client } from '@dexterai/x402/client';
114
121
  // React hook
115
122
  import { useX402Payment } from '@dexterai/x402/react';
116
123
 
117
- // Server helpers (see note below)
124
+ // Server helpers
118
125
  import { createX402Server } from '@dexterai/x402/server';
119
126
 
120
127
  // Chain adapters (advanced)
@@ -126,7 +133,7 @@ import { toAtomicUnits, fromAtomicUnits } from '@dexterai/x402/utils';
126
133
 
127
134
  ---
128
135
 
129
- ## 🛠️ Utilities
136
+ ## Utilities
130
137
 
131
138
  ```typescript
132
139
  import { toAtomicUnits, fromAtomicUnits } from '@dexterai/x402/utils';
@@ -142,7 +149,7 @@ fromAtomicUnits(1500000n, 6); // 1.5
142
149
 
143
150
  ---
144
151
 
145
- ## 🖥️ Server SDK
152
+ ## Server SDK
146
153
 
147
154
  ```typescript
148
155
  import { createX402Server } from '@dexterai/x402/server';
@@ -150,7 +157,6 @@ import { createX402Server } from '@dexterai/x402/server';
150
157
  const server = createX402Server({
151
158
  payTo: 'YourAddress...',
152
159
  network: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
153
- facilitatorUrl: 'https://x402.dexter.cash',
154
160
  });
155
161
 
156
162
  // In your route handler
@@ -175,11 +181,11 @@ app.post('/protected', async (req, res) => {
175
181
  });
176
182
  ```
177
183
 
178
- > ⚠️ **Note:** The server SDK has not been battle-tested in production yet. The client SDK and React hook have been verified with real payments at [dexter.cash/sdk](https://dexter.cash/sdk).
184
+ > **Note:** The server SDK has not been battle-tested in production yet. The client SDK and React hook have been verified with real payments at [dexter.cash/sdk](https://dexter.cash/sdk).
179
185
 
180
186
  ---
181
187
 
182
- ## 💸 Dynamic Pricing
188
+ ## Dynamic Pricing
183
189
 
184
190
  For LLM/AI endpoints where cost scales with input size:
185
191
 
@@ -227,18 +233,18 @@ The client SDK automatically forwards `X-Quote-Hash` on retry.
227
233
 
228
234
  ---
229
235
 
230
- ## 📋 API Reference
236
+ ## API Reference
231
237
 
232
238
  ### `createX402Client(options)`
233
239
 
234
- | Option | Type | Description |
235
- |--------|------|-------------|
236
- | `wallet` | `SolanaWallet` | Single Solana wallet (legacy) |
237
- | `wallets` | `{ solana?, evm? }` | Multi-chain wallets |
238
- | `preferredNetwork` | `string` | Prefer this network when multiple options available |
239
- | `rpcUrls` | `Record<string, string>` | RPC endpoints per network (CAIP-2 format) |
240
- | `maxAmountAtomic` | `string` | Maximum payment cap |
241
- | `verbose` | `boolean` | Enable debug logging |
240
+ | Option | Type | Required | Description |
241
+ |--------|------|----------|-------------|
242
+ | `wallets` | `{ solana?, evm? }` | Yes | Multi-chain wallets |
243
+ | `wallet` | `SolanaWallet` | No | Single Solana wallet (legacy) |
244
+ | `preferredNetwork` | `string` | No | Prefer this network when multiple options available |
245
+ | `rpcUrls` | `Record<string, string>` | No | RPC endpoints per network (defaults to Dexter proxy) |
246
+ | `maxAmountAtomic` | `string` | No | Maximum payment cap |
247
+ | `verbose` | `boolean` | No | Enable debug logging |
242
248
 
243
249
  ### `useX402Payment(options)`
244
250
 
@@ -258,18 +264,17 @@ Returns:
258
264
 
259
265
  ---
260
266
 
261
- ## 🔧 Development
267
+ ## Development
262
268
 
263
269
  ```bash
264
270
  npm run build # Build ESM + CJS
265
271
  npm run dev # Watch mode
266
- npm run typecheck # TypeScript
267
- npm test # Run tests
272
+ npm run typecheck # TypeScript checks
268
273
  ```
269
274
 
270
275
  ---
271
276
 
272
- ## 📄 License
277
+ ## License
273
278
 
274
279
  MIT — see [LICENSE](./LICENSE)
275
280
 
@@ -48,7 +48,7 @@ var init_solana = __esm({
48
48
  SOLANA_DEVNET = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
49
49
  SOLANA_TESTNET = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
50
50
  DEFAULT_RPC_URLS = {
51
- [SOLANA_MAINNET]: "https://api.mainnet-beta.solana.com",
51
+ [SOLANA_MAINNET]: "https://api.dexter.cash/api/solana/rpc",
52
52
  [SOLANA_DEVNET]: "https://api.devnet.solana.com",
53
53
  [SOLANA_TESTNET]: "https://api.testnet.solana.com"
54
54
  };
@@ -255,7 +255,7 @@ var init_evm = __esm({
255
255
  [ARBITRUM_ONE]: 42161
256
256
  };
257
257
  DEFAULT_RPC_URLS2 = {
258
- [BASE_MAINNET]: "https://mainnet.base.org",
258
+ [BASE_MAINNET]: "https://api.dexter.cash/api/base/rpc",
259
259
  [BASE_SEPOLIA]: "https://sepolia.base.org",
260
260
  [ETHEREUM_MAINNET]: "https://eth.llamarpc.com",
261
261
  [ARBITRUM_ONE]: "https://arb1.arbitrum.io/rpc"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/solana.ts","../../src/adapters/evm.ts","../../src/adapters/index.ts"],"sourcesContent":["/**\n * Solana Chain Adapter\n *\n * Implements the ChainAdapter interface for Solana networks.\n * Handles transaction building, signing, and balance queries.\n */\n\nimport {\n PublicKey,\n Connection,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n getAccount,\n createTransferCheckedInstruction,\n getMint,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for Solana\n */\nexport const SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nexport const SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\nexport const SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [SOLANA_MAINNET]: 'https://api.mainnet-beta.solana.com',\n [SOLANA_DEVNET]: 'https://api.devnet.solana.com',\n [SOLANA_TESTNET]: 'https://api.testnet.solana.com',\n};\n\n/**\n * Dexter policy-safe compute budget settings\n */\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 12_000;\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\n\n/**\n * Solana wallet interface (compatible with @solana/wallet-adapter)\n */\nexport interface SolanaWallet {\n publicKey: { toBase58(): string } | null;\n signTransaction<T>(tx: T): Promise<T>;\n}\n\n/**\n * Check if an object is a valid Solana wallet\n */\nexport function isSolanaWallet(wallet: unknown): wallet is SolanaWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'publicKey' in w &&\n 'signTransaction' in w &&\n typeof w.signTransaction === 'function'\n );\n}\n\n/**\n * Solana Chain Adapter\n */\nexport class SolanaAdapter implements ChainAdapter {\n readonly name = 'Solana';\n readonly networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:solana]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle both exact CAIP-2 and legacy formats\n if (this.networks.includes(network)) return true;\n // Legacy format support\n if (network === 'solana') return true;\n if (network === 'solana-devnet') return true;\n if (network === 'solana-testnet') return true;\n // Check if it starts with 'solana:'\n if (network.startsWith('solana:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n // Check custom config first\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n // Check defaults\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy networks\n if (network === 'solana') return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n if (network === 'solana-devnet') return DEFAULT_RPC_URLS[SOLANA_DEVNET];\n if (network === 'solana-testnet') return DEFAULT_RPC_URLS[SOLANA_TESTNET];\n // Default to mainnet\n return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isSolanaWallet(wallet)) return null;\n return wallet.publicKey?.toBase58() ?? null;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isSolanaWallet(wallet)) return false;\n return wallet.publicKey !== null;\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isSolanaWallet(wallet) || !wallet.publicKey) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n const mintPubkey = new PublicKey(accept.asset);\n\n try {\n // Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n const programId =\n mintInfo?.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const ata = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n\n const account = await getAccount(connection, ata, undefined, programId);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(account.amount) / Math.pow(10, decimals);\n } catch {\n // Token account doesn't exist\n return 0;\n }\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isSolanaWallet(wallet)) {\n throw new Error('Invalid Solana wallet');\n }\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n\n // Extract required fields (amount or maxAmountRequired for x402 spec compatibility)\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n if (!extra?.feePayer) {\n throw new Error('Missing feePayer in payment requirements');\n }\n // Note: decimals is optional - we fetch from mint on-chain if not provided\n\n const feePayerPubkey = new PublicKey(extra.feePayer);\n const mintPubkey = new PublicKey(asset);\n const destinationPubkey = new PublicKey(payTo);\n\n this.log('Building transaction:', {\n from: userPubkey.toBase58(),\n to: payTo,\n amount,\n asset,\n feePayer: extra.feePayer,\n });\n\n // Build instructions\n const instructions: TransactionInstruction[] = [];\n\n // 1. ComputeBudget: Set compute unit limit\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n })\n );\n\n // 2. ComputeBudget: Set compute unit price\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n })\n );\n\n // 3. Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n if (!mintInfo) {\n throw new Error(`Token mint ${asset} not found`);\n }\n\n const programId =\n mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals (required for TransferChecked)\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n if (typeof extra?.decimals === 'number' && mint.decimals !== extra.decimals) {\n this.log(\n `Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`\n );\n }\n\n // Derive Associated Token Accounts\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destinationPubkey,\n false,\n programId\n );\n\n // Verify source ATA exists\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, 'confirmed');\n if (!sourceAtaInfo) {\n throw new Error(\n `No token account found for ${asset}. Please ensure you have USDC in your wallet.`\n );\n }\n\n // Verify destination ATA exists\n const destAtaInfo = await connection.getAccountInfo(destinationAta, 'confirmed');\n if (!destAtaInfo) {\n throw new Error(\n `Seller token account not found. The seller (${payTo}) must have a USDC account.`\n );\n }\n\n // 4. TransferChecked instruction\n const amountBigInt = BigInt(amount);\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amountBigInt,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash('confirmed');\n\n // Compile to V0 message (feePayer is facilitator)\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create and sign transaction\n const transaction = new VersionedTransaction(message);\n const signedTx = await wallet.signTransaction(transaction);\n\n this.log('Transaction signed successfully');\n\n return {\n serialized: Buffer.from(signedTx.serialize()).toString('base64'),\n };\n }\n}\n\n/**\n * Create a Solana adapter instance\n */\nexport function createSolanaAdapter(config?: AdapterConfig): SolanaAdapter {\n return new SolanaAdapter(config);\n}\n\n\n\n","/**\n * EVM Chain Adapter\n *\n * Implements the ChainAdapter interface for EVM networks (Base, Ethereum, Arbitrum, etc.)\n * Uses EIP-712 typed data signing for x402 v2 payments.\n */\n\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for EVM chains\n */\nexport const BASE_MAINNET = 'eip155:8453';\nexport const BASE_SEPOLIA = 'eip155:84532';\nexport const ETHEREUM_MAINNET = 'eip155:1';\nexport const ARBITRUM_ONE = 'eip155:42161';\n\n/**\n * Chain IDs by CAIP-2 network\n */\nconst CHAIN_IDS: Record<string, number> = {\n [BASE_MAINNET]: 8453,\n [BASE_SEPOLIA]: 84532,\n [ETHEREUM_MAINNET]: 1,\n [ARBITRUM_ONE]: 42161,\n};\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [BASE_MAINNET]: 'https://mainnet.base.org',\n [BASE_SEPOLIA]: 'https://sepolia.base.org',\n [ETHEREUM_MAINNET]: 'https://eth.llamarpc.com',\n [ARBITRUM_ONE]: 'https://arb1.arbitrum.io/rpc',\n};\n\n/**\n * USDC addresses by chain (for reference)\n */\nexport const USDC_ADDRESSES: Record<string, string> = {\n [BASE_MAINNET]: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n [ETHEREUM_MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ARBITRUM_ONE]: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n};\n\n/**\n * EVM wallet interface (compatible with wagmi, ethers, viem)\n */\nexport interface EvmWallet {\n /** Wallet address */\n address: string;\n /** Chain ID currently connected to */\n chainId?: number;\n /**\n * Sign typed data (EIP-712)\n * This is the primary signing method for x402 EVM payments\n */\n signTypedData?(params: {\n domain: Record<string, unknown>;\n types: Record<string, unknown[]>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Alternative: Send transaction directly\n * Used if signTypedData is not available\n */\n sendTransaction?(params: {\n to: string;\n data: string;\n value?: bigint;\n }): Promise<string>;\n}\n\n/**\n * Check if an object is a valid EVM wallet\n */\nexport function isEvmWallet(wallet: unknown): wallet is EvmWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'address' in w &&\n typeof w.address === 'string' &&\n w.address.startsWith('0x')\n );\n}\n\n// ERC20 balanceOf function selector: 0x70a08231\n\n/**\n * EVM Chain Adapter\n */\nexport class EvmAdapter implements ChainAdapter {\n readonly name = 'EVM';\n readonly networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:evm]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle exact CAIP-2\n if (this.networks.includes(network)) return true;\n // Legacy format\n if (network === 'base') return true;\n if (network === 'ethereum') return true;\n if (network === 'arbitrum') return true;\n // Check if it starts with 'eip155:'\n if (network.startsWith('eip155:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy\n if (network === 'base') return DEFAULT_RPC_URLS[BASE_MAINNET];\n if (network === 'ethereum') return DEFAULT_RPC_URLS[ETHEREUM_MAINNET];\n if (network === 'arbitrum') return DEFAULT_RPC_URLS[ARBITRUM_ONE];\n return DEFAULT_RPC_URLS[BASE_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isEvmWallet(wallet)) return null;\n return wallet.address;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isEvmWallet(wallet)) return false;\n return !!wallet.address;\n }\n\n private getChainId(network: string): number {\n if (CHAIN_IDS[network]) return CHAIN_IDS[network];\n // Try to extract from CAIP-2\n if (network.startsWith('eip155:')) {\n const chainIdStr = network.split(':')[1];\n return parseInt(chainIdStr, 10);\n }\n // Defaults\n if (network === 'base') return 8453;\n if (network === 'ethereum') return 1;\n if (network === 'arbitrum') return 42161;\n return 8453; // Default to Base\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isEvmWallet(wallet) || !wallet.address) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n\n try {\n // Use eth_call to check ERC20 balance\n const data = this.encodeBalanceOf(wallet.address);\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: accept.asset,\n data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = (await response.json()) as { error?: unknown; result?: string };\n if (result.error || !result.result) {\n return 0;\n }\n\n const balance = BigInt(result.result);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(balance) / Math.pow(10, decimals);\n } catch {\n return 0;\n }\n }\n\n private encodeBalanceOf(address: string): string {\n // Function selector for balanceOf(address)\n const selector = '0x70a08231';\n // Pad address to 32 bytes\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, '0');\n return selector + paddedAddress;\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n _rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isEvmWallet(wallet)) {\n throw new Error('Invalid EVM wallet');\n }\n if (!wallet.address) {\n throw new Error('Wallet not connected');\n }\n\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n this.log('Building EVM transaction:', {\n from: wallet.address,\n to: payTo,\n amount,\n asset,\n network: accept.network,\n });\n\n // For x402 v2 EVM payments, we use EIP-712 typed data signing\n // The facilitator will execute the transfer on behalf of the user\n\n const chainId = this.getChainId(accept.network);\n\n // Build the EIP-712 typed data\n // This matches what Dexter's facilitator expects\n const domain = {\n name: extra?.name ?? 'USD Coin',\n version: extra?.version ?? '2',\n chainId: BigInt(chainId),\n verifyingContract: asset as `0x${string}`,\n };\n\n const types = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n // Generate a random nonce (32 bytes hex)\n const nonce = '0x' + [...Array(32)]\n .map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0'))\n .join('') as `0x${string}`;\n\n const now = Math.floor(Date.now() / 1000);\n \n // Authorization object - values as strings for JSON, BigInts for signing\n const authorization = {\n from: wallet.address,\n to: payTo,\n value: amount, // string\n validAfter: String(now - 600), // 10 minutes before (matching upstream)\n validBefore: String(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n // Message for signing uses BigInt values\n const message = {\n from: wallet.address,\n to: payTo,\n value: BigInt(amount),\n validAfter: BigInt(now - 600),\n validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n if (!wallet.signTypedData) {\n throw new Error('Wallet does not support signTypedData (EIP-712)');\n }\n\n const signature = await wallet.signTypedData({\n domain: domain as Record<string, unknown>,\n types: types as Record<string, unknown[]>,\n primaryType: 'TransferWithAuthorization',\n message: message as Record<string, unknown>,\n });\n\n this.log('EIP-712 signature obtained');\n\n // Payload structure matches upstream @x402/evm exactly\n const payload = {\n authorization,\n signature,\n };\n\n return {\n serialized: JSON.stringify(payload),\n signature,\n };\n }\n}\n\n/**\n * Create an EVM adapter instance\n */\nexport function createEvmAdapter(config?: AdapterConfig): EvmAdapter {\n return new EvmAdapter(config);\n}\n\n","/**\n * Chain Adapters\n *\n * x402 v2 is designed to be chain-agnostic. Each adapter handles\n * the specifics of transaction building and signing for its chain.\n *\n * @example\n * ```typescript\n * import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';\n *\n * const adapters = [\n * createSolanaAdapter(),\n * createEvmAdapter(),\n * ];\n *\n * // Find adapter for a network\n * const adapter = adapters.find(a => a.canHandle('eip155:8453'));\n * ```\n */\n\n// Types\nexport type {\n ChainAdapter,\n AdapterConfig,\n SignedTransaction,\n GenericWallet,\n WalletSet,\n BalanceInfo,\n} from './types';\n\n// Solana\nexport {\n SolanaAdapter,\n createSolanaAdapter,\n isSolanaWallet,\n SOLANA_MAINNET,\n SOLANA_DEVNET,\n SOLANA_TESTNET,\n} from './solana';\nexport type { SolanaWallet } from './solana';\n\n// EVM\nexport {\n EvmAdapter,\n createEvmAdapter,\n isEvmWallet,\n BASE_MAINNET,\n BASE_SEPOLIA,\n ETHEREUM_MAINNET,\n ARBITRUM_ONE,\n} from './evm';\nexport type { EvmWallet } from './evm';\n\n/**\n * Create all default adapters\n */\nexport function createDefaultAdapters(verbose = false) {\n const { createSolanaAdapter } = require('./solana');\n const { createEvmAdapter } = require('./evm');\n return [\n createSolanaAdapter({ verbose }),\n createEvmAdapter({ verbose }),\n ];\n}\n\n/**\n * Find adapter that can handle a network\n */\nexport function findAdapter(\n adapters: import('./types').ChainAdapter[],\n network: string\n): import('./types').ChainAdapter | undefined {\n return adapters.find(adapter => adapter.canHandle(network));\n}\n\n\n\n"],"mappings":"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","names":["DEFAULT_RPC_URLS","createSolanaAdapter","createEvmAdapter"]}
1
+ {"version":3,"sources":["../../src/adapters/solana.ts","../../src/adapters/evm.ts","../../src/adapters/index.ts"],"sourcesContent":["/**\n * Solana Chain Adapter\n *\n * Implements the ChainAdapter interface for Solana networks.\n * Handles transaction building, signing, and balance queries.\n */\n\nimport {\n PublicKey,\n Connection,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n getAccount,\n createTransferCheckedInstruction,\n getMint,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for Solana\n */\nexport const SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nexport const SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\nexport const SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n\n/**\n * Default RPC URLs\n * Mainnet uses Dexter's RPC proxy for reliability and zero-config setup\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [SOLANA_MAINNET]: 'https://api.dexter.cash/api/solana/rpc',\n [SOLANA_DEVNET]: 'https://api.devnet.solana.com',\n [SOLANA_TESTNET]: 'https://api.testnet.solana.com',\n};\n\n/**\n * Dexter policy-safe compute budget settings\n */\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 12_000;\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\n\n/**\n * Solana wallet interface (compatible with @solana/wallet-adapter)\n */\nexport interface SolanaWallet {\n publicKey: { toBase58(): string } | null;\n signTransaction<T>(tx: T): Promise<T>;\n}\n\n/**\n * Check if an object is a valid Solana wallet\n */\nexport function isSolanaWallet(wallet: unknown): wallet is SolanaWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'publicKey' in w &&\n 'signTransaction' in w &&\n typeof w.signTransaction === 'function'\n );\n}\n\n/**\n * Solana Chain Adapter\n */\nexport class SolanaAdapter implements ChainAdapter {\n readonly name = 'Solana';\n readonly networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:solana]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle both exact CAIP-2 and legacy formats\n if (this.networks.includes(network)) return true;\n // Legacy format support\n if (network === 'solana') return true;\n if (network === 'solana-devnet') return true;\n if (network === 'solana-testnet') return true;\n // Check if it starts with 'solana:'\n if (network.startsWith('solana:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n // Check custom config first\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n // Check defaults\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy networks\n if (network === 'solana') return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n if (network === 'solana-devnet') return DEFAULT_RPC_URLS[SOLANA_DEVNET];\n if (network === 'solana-testnet') return DEFAULT_RPC_URLS[SOLANA_TESTNET];\n // Default to mainnet\n return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isSolanaWallet(wallet)) return null;\n return wallet.publicKey?.toBase58() ?? null;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isSolanaWallet(wallet)) return false;\n return wallet.publicKey !== null;\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isSolanaWallet(wallet) || !wallet.publicKey) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n const mintPubkey = new PublicKey(accept.asset);\n\n try {\n // Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n const programId =\n mintInfo?.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const ata = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n\n const account = await getAccount(connection, ata, undefined, programId);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(account.amount) / Math.pow(10, decimals);\n } catch {\n // Token account doesn't exist\n return 0;\n }\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isSolanaWallet(wallet)) {\n throw new Error('Invalid Solana wallet');\n }\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n\n // Extract required fields (amount or maxAmountRequired for x402 spec compatibility)\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n if (!extra?.feePayer) {\n throw new Error('Missing feePayer in payment requirements');\n }\n // Note: decimals is optional - we fetch from mint on-chain if not provided\n\n const feePayerPubkey = new PublicKey(extra.feePayer);\n const mintPubkey = new PublicKey(asset);\n const destinationPubkey = new PublicKey(payTo);\n\n this.log('Building transaction:', {\n from: userPubkey.toBase58(),\n to: payTo,\n amount,\n asset,\n feePayer: extra.feePayer,\n });\n\n // Build instructions\n const instructions: TransactionInstruction[] = [];\n\n // 1. ComputeBudget: Set compute unit limit\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n })\n );\n\n // 2. ComputeBudget: Set compute unit price\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n })\n );\n\n // 3. Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n if (!mintInfo) {\n throw new Error(`Token mint ${asset} not found`);\n }\n\n const programId =\n mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals (required for TransferChecked)\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n if (typeof extra?.decimals === 'number' && mint.decimals !== extra.decimals) {\n this.log(\n `Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`\n );\n }\n\n // Derive Associated Token Accounts\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destinationPubkey,\n false,\n programId\n );\n\n // Verify source ATA exists\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, 'confirmed');\n if (!sourceAtaInfo) {\n throw new Error(\n `No token account found for ${asset}. Please ensure you have USDC in your wallet.`\n );\n }\n\n // Verify destination ATA exists\n const destAtaInfo = await connection.getAccountInfo(destinationAta, 'confirmed');\n if (!destAtaInfo) {\n throw new Error(\n `Seller token account not found. The seller (${payTo}) must have a USDC account.`\n );\n }\n\n // 4. TransferChecked instruction\n const amountBigInt = BigInt(amount);\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amountBigInt,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash('confirmed');\n\n // Compile to V0 message (feePayer is facilitator)\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create and sign transaction\n const transaction = new VersionedTransaction(message);\n const signedTx = await wallet.signTransaction(transaction);\n\n this.log('Transaction signed successfully');\n\n return {\n serialized: Buffer.from(signedTx.serialize()).toString('base64'),\n };\n }\n}\n\n/**\n * Create a Solana adapter instance\n */\nexport function createSolanaAdapter(config?: AdapterConfig): SolanaAdapter {\n return new SolanaAdapter(config);\n}\n\n\n\n","/**\n * EVM Chain Adapter\n *\n * Implements the ChainAdapter interface for EVM networks (Base, Ethereum, Arbitrum, etc.)\n * Uses EIP-712 typed data signing for x402 v2 payments.\n */\n\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for EVM chains\n */\nexport const BASE_MAINNET = 'eip155:8453';\nexport const BASE_SEPOLIA = 'eip155:84532';\nexport const ETHEREUM_MAINNET = 'eip155:1';\nexport const ARBITRUM_ONE = 'eip155:42161';\n\n/**\n * Chain IDs by CAIP-2 network\n */\nconst CHAIN_IDS: Record<string, number> = {\n [BASE_MAINNET]: 8453,\n [BASE_SEPOLIA]: 84532,\n [ETHEREUM_MAINNET]: 1,\n [ARBITRUM_ONE]: 42161,\n};\n\n/**\n * Default RPC URLs\n * Base mainnet uses Dexter's RPC proxy for reliability and zero-config setup\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [BASE_MAINNET]: 'https://api.dexter.cash/api/base/rpc',\n [BASE_SEPOLIA]: 'https://sepolia.base.org',\n [ETHEREUM_MAINNET]: 'https://eth.llamarpc.com',\n [ARBITRUM_ONE]: 'https://arb1.arbitrum.io/rpc',\n};\n\n/**\n * USDC addresses by chain (for reference)\n */\nexport const USDC_ADDRESSES: Record<string, string> = {\n [BASE_MAINNET]: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n [ETHEREUM_MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ARBITRUM_ONE]: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n};\n\n/**\n * EVM wallet interface (compatible with wagmi, ethers, viem)\n */\nexport interface EvmWallet {\n /** Wallet address */\n address: string;\n /** Chain ID currently connected to */\n chainId?: number;\n /**\n * Sign typed data (EIP-712)\n * This is the primary signing method for x402 EVM payments\n */\n signTypedData?(params: {\n domain: Record<string, unknown>;\n types: Record<string, unknown[]>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Alternative: Send transaction directly\n * Used if signTypedData is not available\n */\n sendTransaction?(params: {\n to: string;\n data: string;\n value?: bigint;\n }): Promise<string>;\n}\n\n/**\n * Check if an object is a valid EVM wallet\n */\nexport function isEvmWallet(wallet: unknown): wallet is EvmWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'address' in w &&\n typeof w.address === 'string' &&\n w.address.startsWith('0x')\n );\n}\n\n// ERC20 balanceOf function selector: 0x70a08231\n\n/**\n * EVM Chain Adapter\n */\nexport class EvmAdapter implements ChainAdapter {\n readonly name = 'EVM';\n readonly networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:evm]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle exact CAIP-2\n if (this.networks.includes(network)) return true;\n // Legacy format\n if (network === 'base') return true;\n if (network === 'ethereum') return true;\n if (network === 'arbitrum') return true;\n // Check if it starts with 'eip155:'\n if (network.startsWith('eip155:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy\n if (network === 'base') return DEFAULT_RPC_URLS[BASE_MAINNET];\n if (network === 'ethereum') return DEFAULT_RPC_URLS[ETHEREUM_MAINNET];\n if (network === 'arbitrum') return DEFAULT_RPC_URLS[ARBITRUM_ONE];\n return DEFAULT_RPC_URLS[BASE_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isEvmWallet(wallet)) return null;\n return wallet.address;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isEvmWallet(wallet)) return false;\n return !!wallet.address;\n }\n\n private getChainId(network: string): number {\n if (CHAIN_IDS[network]) return CHAIN_IDS[network];\n // Try to extract from CAIP-2\n if (network.startsWith('eip155:')) {\n const chainIdStr = network.split(':')[1];\n return parseInt(chainIdStr, 10);\n }\n // Defaults\n if (network === 'base') return 8453;\n if (network === 'ethereum') return 1;\n if (network === 'arbitrum') return 42161;\n return 8453; // Default to Base\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isEvmWallet(wallet) || !wallet.address) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n\n try {\n // Use eth_call to check ERC20 balance\n const data = this.encodeBalanceOf(wallet.address);\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: accept.asset,\n data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = (await response.json()) as { error?: unknown; result?: string };\n if (result.error || !result.result) {\n return 0;\n }\n\n const balance = BigInt(result.result);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(balance) / Math.pow(10, decimals);\n } catch {\n return 0;\n }\n }\n\n private encodeBalanceOf(address: string): string {\n // Function selector for balanceOf(address)\n const selector = '0x70a08231';\n // Pad address to 32 bytes\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, '0');\n return selector + paddedAddress;\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n _rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isEvmWallet(wallet)) {\n throw new Error('Invalid EVM wallet');\n }\n if (!wallet.address) {\n throw new Error('Wallet not connected');\n }\n\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n this.log('Building EVM transaction:', {\n from: wallet.address,\n to: payTo,\n amount,\n asset,\n network: accept.network,\n });\n\n // For x402 v2 EVM payments, we use EIP-712 typed data signing\n // The facilitator will execute the transfer on behalf of the user\n\n const chainId = this.getChainId(accept.network);\n\n // Build the EIP-712 typed data\n // This matches what Dexter's facilitator expects\n const domain = {\n name: extra?.name ?? 'USD Coin',\n version: extra?.version ?? '2',\n chainId: BigInt(chainId),\n verifyingContract: asset as `0x${string}`,\n };\n\n const types = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n // Generate a random nonce (32 bytes hex)\n const nonce = '0x' + [...Array(32)]\n .map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0'))\n .join('') as `0x${string}`;\n\n const now = Math.floor(Date.now() / 1000);\n \n // Authorization object - values as strings for JSON, BigInts for signing\n const authorization = {\n from: wallet.address,\n to: payTo,\n value: amount, // string\n validAfter: String(now - 600), // 10 minutes before (matching upstream)\n validBefore: String(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n // Message for signing uses BigInt values\n const message = {\n from: wallet.address,\n to: payTo,\n value: BigInt(amount),\n validAfter: BigInt(now - 600),\n validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n if (!wallet.signTypedData) {\n throw new Error('Wallet does not support signTypedData (EIP-712)');\n }\n\n const signature = await wallet.signTypedData({\n domain: domain as Record<string, unknown>,\n types: types as Record<string, unknown[]>,\n primaryType: 'TransferWithAuthorization',\n message: message as Record<string, unknown>,\n });\n\n this.log('EIP-712 signature obtained');\n\n // Payload structure matches upstream @x402/evm exactly\n const payload = {\n authorization,\n signature,\n };\n\n return {\n serialized: JSON.stringify(payload),\n signature,\n };\n }\n}\n\n/**\n * Create an EVM adapter instance\n */\nexport function createEvmAdapter(config?: AdapterConfig): EvmAdapter {\n return new EvmAdapter(config);\n}\n\n","/**\n * Chain Adapters\n *\n * x402 v2 is designed to be chain-agnostic. Each adapter handles\n * the specifics of transaction building and signing for its chain.\n *\n * @example\n * ```typescript\n * import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';\n *\n * const adapters = [\n * createSolanaAdapter(),\n * createEvmAdapter(),\n * ];\n *\n * // Find adapter for a network\n * const adapter = adapters.find(a => a.canHandle('eip155:8453'));\n * ```\n */\n\n// Types\nexport type {\n ChainAdapter,\n AdapterConfig,\n SignedTransaction,\n GenericWallet,\n WalletSet,\n BalanceInfo,\n} from './types';\n\n// Solana\nexport {\n SolanaAdapter,\n createSolanaAdapter,\n isSolanaWallet,\n SOLANA_MAINNET,\n SOLANA_DEVNET,\n SOLANA_TESTNET,\n} from './solana';\nexport type { SolanaWallet } from './solana';\n\n// EVM\nexport {\n EvmAdapter,\n createEvmAdapter,\n isEvmWallet,\n BASE_MAINNET,\n BASE_SEPOLIA,\n ETHEREUM_MAINNET,\n ARBITRUM_ONE,\n} from './evm';\nexport type { EvmWallet } from './evm';\n\n/**\n * Create all default adapters\n */\nexport function createDefaultAdapters(verbose = false) {\n const { createSolanaAdapter } = require('./solana');\n const { createEvmAdapter } = require('./evm');\n return [\n createSolanaAdapter({ verbose }),\n createEvmAdapter({ verbose }),\n ];\n}\n\n/**\n * Find adapter that can handle a network\n */\nexport function findAdapter(\n adapters: import('./types').ChainAdapter[],\n network: string\n): import('./types').ChainAdapter | undefined {\n return adapters.find(adapter => adapter.canHandle(network));\n}\n\n\n\n"],"mappings":"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","names":["DEFAULT_RPC_URLS","createSolanaAdapter","createEvmAdapter"]}
@@ -60,7 +60,7 @@ var init_solana = __esm({
60
60
  SOLANA_DEVNET = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
61
61
  SOLANA_TESTNET = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
62
62
  DEFAULT_RPC_URLS = {
63
- [SOLANA_MAINNET]: "https://api.mainnet-beta.solana.com",
63
+ [SOLANA_MAINNET]: "https://api.dexter.cash/api/solana/rpc",
64
64
  [SOLANA_DEVNET]: "https://api.devnet.solana.com",
65
65
  [SOLANA_TESTNET]: "https://api.testnet.solana.com"
66
66
  };
@@ -267,7 +267,7 @@ var init_evm = __esm({
267
267
  [ARBITRUM_ONE]: 42161
268
268
  };
269
269
  DEFAULT_RPC_URLS2 = {
270
- [BASE_MAINNET]: "https://mainnet.base.org",
270
+ [BASE_MAINNET]: "https://api.dexter.cash/api/base/rpc",
271
271
  [BASE_SEPOLIA]: "https://sepolia.base.org",
272
272
  [ETHEREUM_MAINNET]: "https://eth.llamarpc.com",
273
273
  [ARBITRUM_ONE]: "https://arb1.arbitrum.io/rpc"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/solana.ts","../../src/adapters/evm.ts","../../src/adapters/index.ts"],"sourcesContent":["/**\n * Solana Chain Adapter\n *\n * Implements the ChainAdapter interface for Solana networks.\n * Handles transaction building, signing, and balance queries.\n */\n\nimport {\n PublicKey,\n Connection,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n getAccount,\n createTransferCheckedInstruction,\n getMint,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for Solana\n */\nexport const SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nexport const SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\nexport const SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [SOLANA_MAINNET]: 'https://api.mainnet-beta.solana.com',\n [SOLANA_DEVNET]: 'https://api.devnet.solana.com',\n [SOLANA_TESTNET]: 'https://api.testnet.solana.com',\n};\n\n/**\n * Dexter policy-safe compute budget settings\n */\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 12_000;\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\n\n/**\n * Solana wallet interface (compatible with @solana/wallet-adapter)\n */\nexport interface SolanaWallet {\n publicKey: { toBase58(): string } | null;\n signTransaction<T>(tx: T): Promise<T>;\n}\n\n/**\n * Check if an object is a valid Solana wallet\n */\nexport function isSolanaWallet(wallet: unknown): wallet is SolanaWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'publicKey' in w &&\n 'signTransaction' in w &&\n typeof w.signTransaction === 'function'\n );\n}\n\n/**\n * Solana Chain Adapter\n */\nexport class SolanaAdapter implements ChainAdapter {\n readonly name = 'Solana';\n readonly networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:solana]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle both exact CAIP-2 and legacy formats\n if (this.networks.includes(network)) return true;\n // Legacy format support\n if (network === 'solana') return true;\n if (network === 'solana-devnet') return true;\n if (network === 'solana-testnet') return true;\n // Check if it starts with 'solana:'\n if (network.startsWith('solana:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n // Check custom config first\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n // Check defaults\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy networks\n if (network === 'solana') return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n if (network === 'solana-devnet') return DEFAULT_RPC_URLS[SOLANA_DEVNET];\n if (network === 'solana-testnet') return DEFAULT_RPC_URLS[SOLANA_TESTNET];\n // Default to mainnet\n return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isSolanaWallet(wallet)) return null;\n return wallet.publicKey?.toBase58() ?? null;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isSolanaWallet(wallet)) return false;\n return wallet.publicKey !== null;\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isSolanaWallet(wallet) || !wallet.publicKey) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n const mintPubkey = new PublicKey(accept.asset);\n\n try {\n // Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n const programId =\n mintInfo?.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const ata = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n\n const account = await getAccount(connection, ata, undefined, programId);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(account.amount) / Math.pow(10, decimals);\n } catch {\n // Token account doesn't exist\n return 0;\n }\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isSolanaWallet(wallet)) {\n throw new Error('Invalid Solana wallet');\n }\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n\n // Extract required fields (amount or maxAmountRequired for x402 spec compatibility)\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n if (!extra?.feePayer) {\n throw new Error('Missing feePayer in payment requirements');\n }\n // Note: decimals is optional - we fetch from mint on-chain if not provided\n\n const feePayerPubkey = new PublicKey(extra.feePayer);\n const mintPubkey = new PublicKey(asset);\n const destinationPubkey = new PublicKey(payTo);\n\n this.log('Building transaction:', {\n from: userPubkey.toBase58(),\n to: payTo,\n amount,\n asset,\n feePayer: extra.feePayer,\n });\n\n // Build instructions\n const instructions: TransactionInstruction[] = [];\n\n // 1. ComputeBudget: Set compute unit limit\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n })\n );\n\n // 2. ComputeBudget: Set compute unit price\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n })\n );\n\n // 3. Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n if (!mintInfo) {\n throw new Error(`Token mint ${asset} not found`);\n }\n\n const programId =\n mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals (required for TransferChecked)\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n if (typeof extra?.decimals === 'number' && mint.decimals !== extra.decimals) {\n this.log(\n `Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`\n );\n }\n\n // Derive Associated Token Accounts\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destinationPubkey,\n false,\n programId\n );\n\n // Verify source ATA exists\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, 'confirmed');\n if (!sourceAtaInfo) {\n throw new Error(\n `No token account found for ${asset}. Please ensure you have USDC in your wallet.`\n );\n }\n\n // Verify destination ATA exists\n const destAtaInfo = await connection.getAccountInfo(destinationAta, 'confirmed');\n if (!destAtaInfo) {\n throw new Error(\n `Seller token account not found. The seller (${payTo}) must have a USDC account.`\n );\n }\n\n // 4. TransferChecked instruction\n const amountBigInt = BigInt(amount);\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amountBigInt,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash('confirmed');\n\n // Compile to V0 message (feePayer is facilitator)\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create and sign transaction\n const transaction = new VersionedTransaction(message);\n const signedTx = await wallet.signTransaction(transaction);\n\n this.log('Transaction signed successfully');\n\n return {\n serialized: Buffer.from(signedTx.serialize()).toString('base64'),\n };\n }\n}\n\n/**\n * Create a Solana adapter instance\n */\nexport function createSolanaAdapter(config?: AdapterConfig): SolanaAdapter {\n return new SolanaAdapter(config);\n}\n\n\n\n","/**\n * EVM Chain Adapter\n *\n * Implements the ChainAdapter interface for EVM networks (Base, Ethereum, Arbitrum, etc.)\n * Uses EIP-712 typed data signing for x402 v2 payments.\n */\n\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for EVM chains\n */\nexport const BASE_MAINNET = 'eip155:8453';\nexport const BASE_SEPOLIA = 'eip155:84532';\nexport const ETHEREUM_MAINNET = 'eip155:1';\nexport const ARBITRUM_ONE = 'eip155:42161';\n\n/**\n * Chain IDs by CAIP-2 network\n */\nconst CHAIN_IDS: Record<string, number> = {\n [BASE_MAINNET]: 8453,\n [BASE_SEPOLIA]: 84532,\n [ETHEREUM_MAINNET]: 1,\n [ARBITRUM_ONE]: 42161,\n};\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [BASE_MAINNET]: 'https://mainnet.base.org',\n [BASE_SEPOLIA]: 'https://sepolia.base.org',\n [ETHEREUM_MAINNET]: 'https://eth.llamarpc.com',\n [ARBITRUM_ONE]: 'https://arb1.arbitrum.io/rpc',\n};\n\n/**\n * USDC addresses by chain (for reference)\n */\nexport const USDC_ADDRESSES: Record<string, string> = {\n [BASE_MAINNET]: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n [ETHEREUM_MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ARBITRUM_ONE]: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n};\n\n/**\n * EVM wallet interface (compatible with wagmi, ethers, viem)\n */\nexport interface EvmWallet {\n /** Wallet address */\n address: string;\n /** Chain ID currently connected to */\n chainId?: number;\n /**\n * Sign typed data (EIP-712)\n * This is the primary signing method for x402 EVM payments\n */\n signTypedData?(params: {\n domain: Record<string, unknown>;\n types: Record<string, unknown[]>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Alternative: Send transaction directly\n * Used if signTypedData is not available\n */\n sendTransaction?(params: {\n to: string;\n data: string;\n value?: bigint;\n }): Promise<string>;\n}\n\n/**\n * Check if an object is a valid EVM wallet\n */\nexport function isEvmWallet(wallet: unknown): wallet is EvmWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'address' in w &&\n typeof w.address === 'string' &&\n w.address.startsWith('0x')\n );\n}\n\n// ERC20 balanceOf function selector: 0x70a08231\n\n/**\n * EVM Chain Adapter\n */\nexport class EvmAdapter implements ChainAdapter {\n readonly name = 'EVM';\n readonly networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:evm]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle exact CAIP-2\n if (this.networks.includes(network)) return true;\n // Legacy format\n if (network === 'base') return true;\n if (network === 'ethereum') return true;\n if (network === 'arbitrum') return true;\n // Check if it starts with 'eip155:'\n if (network.startsWith('eip155:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy\n if (network === 'base') return DEFAULT_RPC_URLS[BASE_MAINNET];\n if (network === 'ethereum') return DEFAULT_RPC_URLS[ETHEREUM_MAINNET];\n if (network === 'arbitrum') return DEFAULT_RPC_URLS[ARBITRUM_ONE];\n return DEFAULT_RPC_URLS[BASE_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isEvmWallet(wallet)) return null;\n return wallet.address;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isEvmWallet(wallet)) return false;\n return !!wallet.address;\n }\n\n private getChainId(network: string): number {\n if (CHAIN_IDS[network]) return CHAIN_IDS[network];\n // Try to extract from CAIP-2\n if (network.startsWith('eip155:')) {\n const chainIdStr = network.split(':')[1];\n return parseInt(chainIdStr, 10);\n }\n // Defaults\n if (network === 'base') return 8453;\n if (network === 'ethereum') return 1;\n if (network === 'arbitrum') return 42161;\n return 8453; // Default to Base\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isEvmWallet(wallet) || !wallet.address) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n\n try {\n // Use eth_call to check ERC20 balance\n const data = this.encodeBalanceOf(wallet.address);\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: accept.asset,\n data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = (await response.json()) as { error?: unknown; result?: string };\n if (result.error || !result.result) {\n return 0;\n }\n\n const balance = BigInt(result.result);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(balance) / Math.pow(10, decimals);\n } catch {\n return 0;\n }\n }\n\n private encodeBalanceOf(address: string): string {\n // Function selector for balanceOf(address)\n const selector = '0x70a08231';\n // Pad address to 32 bytes\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, '0');\n return selector + paddedAddress;\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n _rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isEvmWallet(wallet)) {\n throw new Error('Invalid EVM wallet');\n }\n if (!wallet.address) {\n throw new Error('Wallet not connected');\n }\n\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n this.log('Building EVM transaction:', {\n from: wallet.address,\n to: payTo,\n amount,\n asset,\n network: accept.network,\n });\n\n // For x402 v2 EVM payments, we use EIP-712 typed data signing\n // The facilitator will execute the transfer on behalf of the user\n\n const chainId = this.getChainId(accept.network);\n\n // Build the EIP-712 typed data\n // This matches what Dexter's facilitator expects\n const domain = {\n name: extra?.name ?? 'USD Coin',\n version: extra?.version ?? '2',\n chainId: BigInt(chainId),\n verifyingContract: asset as `0x${string}`,\n };\n\n const types = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n // Generate a random nonce (32 bytes hex)\n const nonce = '0x' + [...Array(32)]\n .map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0'))\n .join('') as `0x${string}`;\n\n const now = Math.floor(Date.now() / 1000);\n \n // Authorization object - values as strings for JSON, BigInts for signing\n const authorization = {\n from: wallet.address,\n to: payTo,\n value: amount, // string\n validAfter: String(now - 600), // 10 minutes before (matching upstream)\n validBefore: String(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n // Message for signing uses BigInt values\n const message = {\n from: wallet.address,\n to: payTo,\n value: BigInt(amount),\n validAfter: BigInt(now - 600),\n validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n if (!wallet.signTypedData) {\n throw new Error('Wallet does not support signTypedData (EIP-712)');\n }\n\n const signature = await wallet.signTypedData({\n domain: domain as Record<string, unknown>,\n types: types as Record<string, unknown[]>,\n primaryType: 'TransferWithAuthorization',\n message: message as Record<string, unknown>,\n });\n\n this.log('EIP-712 signature obtained');\n\n // Payload structure matches upstream @x402/evm exactly\n const payload = {\n authorization,\n signature,\n };\n\n return {\n serialized: JSON.stringify(payload),\n signature,\n };\n }\n}\n\n/**\n * Create an EVM adapter instance\n */\nexport function createEvmAdapter(config?: AdapterConfig): EvmAdapter {\n return new EvmAdapter(config);\n}\n\n","/**\n * Chain Adapters\n *\n * x402 v2 is designed to be chain-agnostic. Each adapter handles\n * the specifics of transaction building and signing for its chain.\n *\n * @example\n * ```typescript\n * import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';\n *\n * const adapters = [\n * createSolanaAdapter(),\n * createEvmAdapter(),\n * ];\n *\n * // Find adapter for a network\n * const adapter = adapters.find(a => a.canHandle('eip155:8453'));\n * ```\n */\n\n// Types\nexport type {\n ChainAdapter,\n AdapterConfig,\n SignedTransaction,\n GenericWallet,\n WalletSet,\n BalanceInfo,\n} from './types';\n\n// Solana\nexport {\n SolanaAdapter,\n createSolanaAdapter,\n isSolanaWallet,\n SOLANA_MAINNET,\n SOLANA_DEVNET,\n SOLANA_TESTNET,\n} from './solana';\nexport type { SolanaWallet } from './solana';\n\n// EVM\nexport {\n EvmAdapter,\n createEvmAdapter,\n isEvmWallet,\n BASE_MAINNET,\n BASE_SEPOLIA,\n ETHEREUM_MAINNET,\n ARBITRUM_ONE,\n} from './evm';\nexport type { EvmWallet } from './evm';\n\n/**\n * Create all default adapters\n */\nexport function createDefaultAdapters(verbose = false) {\n const { createSolanaAdapter } = require('./solana');\n const { createEvmAdapter } = require('./evm');\n return [\n createSolanaAdapter({ verbose }),\n createEvmAdapter({ verbose }),\n ];\n}\n\n/**\n * Find adapter that can handle a network\n */\nexport function findAdapter(\n adapters: import('./types').ChainAdapter[],\n network: string\n): import('./types').ChainAdapter | undefined {\n return adapters.find(adapter => adapter.canHandle(network));\n}\n\n\n\n"],"mappings":"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","names":["DEFAULT_RPC_URLS","createSolanaAdapter","createEvmAdapter"]}
1
+ {"version":3,"sources":["../../src/adapters/solana.ts","../../src/adapters/evm.ts","../../src/adapters/index.ts"],"sourcesContent":["/**\n * Solana Chain Adapter\n *\n * Implements the ChainAdapter interface for Solana networks.\n * Handles transaction building, signing, and balance queries.\n */\n\nimport {\n PublicKey,\n Connection,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n getAccount,\n createTransferCheckedInstruction,\n getMint,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for Solana\n */\nexport const SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nexport const SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\nexport const SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n\n/**\n * Default RPC URLs\n * Mainnet uses Dexter's RPC proxy for reliability and zero-config setup\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [SOLANA_MAINNET]: 'https://api.dexter.cash/api/solana/rpc',\n [SOLANA_DEVNET]: 'https://api.devnet.solana.com',\n [SOLANA_TESTNET]: 'https://api.testnet.solana.com',\n};\n\n/**\n * Dexter policy-safe compute budget settings\n */\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 12_000;\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\n\n/**\n * Solana wallet interface (compatible with @solana/wallet-adapter)\n */\nexport interface SolanaWallet {\n publicKey: { toBase58(): string } | null;\n signTransaction<T>(tx: T): Promise<T>;\n}\n\n/**\n * Check if an object is a valid Solana wallet\n */\nexport function isSolanaWallet(wallet: unknown): wallet is SolanaWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'publicKey' in w &&\n 'signTransaction' in w &&\n typeof w.signTransaction === 'function'\n );\n}\n\n/**\n * Solana Chain Adapter\n */\nexport class SolanaAdapter implements ChainAdapter {\n readonly name = 'Solana';\n readonly networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:solana]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle both exact CAIP-2 and legacy formats\n if (this.networks.includes(network)) return true;\n // Legacy format support\n if (network === 'solana') return true;\n if (network === 'solana-devnet') return true;\n if (network === 'solana-testnet') return true;\n // Check if it starts with 'solana:'\n if (network.startsWith('solana:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n // Check custom config first\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n // Check defaults\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy networks\n if (network === 'solana') return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n if (network === 'solana-devnet') return DEFAULT_RPC_URLS[SOLANA_DEVNET];\n if (network === 'solana-testnet') return DEFAULT_RPC_URLS[SOLANA_TESTNET];\n // Default to mainnet\n return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isSolanaWallet(wallet)) return null;\n return wallet.publicKey?.toBase58() ?? null;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isSolanaWallet(wallet)) return false;\n return wallet.publicKey !== null;\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isSolanaWallet(wallet) || !wallet.publicKey) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n const mintPubkey = new PublicKey(accept.asset);\n\n try {\n // Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n const programId =\n mintInfo?.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const ata = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n\n const account = await getAccount(connection, ata, undefined, programId);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(account.amount) / Math.pow(10, decimals);\n } catch {\n // Token account doesn't exist\n return 0;\n }\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isSolanaWallet(wallet)) {\n throw new Error('Invalid Solana wallet');\n }\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n\n // Extract required fields (amount or maxAmountRequired for x402 spec compatibility)\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n if (!extra?.feePayer) {\n throw new Error('Missing feePayer in payment requirements');\n }\n // Note: decimals is optional - we fetch from mint on-chain if not provided\n\n const feePayerPubkey = new PublicKey(extra.feePayer);\n const mintPubkey = new PublicKey(asset);\n const destinationPubkey = new PublicKey(payTo);\n\n this.log('Building transaction:', {\n from: userPubkey.toBase58(),\n to: payTo,\n amount,\n asset,\n feePayer: extra.feePayer,\n });\n\n // Build instructions\n const instructions: TransactionInstruction[] = [];\n\n // 1. ComputeBudget: Set compute unit limit\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n })\n );\n\n // 2. ComputeBudget: Set compute unit price\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n })\n );\n\n // 3. Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n if (!mintInfo) {\n throw new Error(`Token mint ${asset} not found`);\n }\n\n const programId =\n mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals (required for TransferChecked)\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n if (typeof extra?.decimals === 'number' && mint.decimals !== extra.decimals) {\n this.log(\n `Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`\n );\n }\n\n // Derive Associated Token Accounts\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destinationPubkey,\n false,\n programId\n );\n\n // Verify source ATA exists\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, 'confirmed');\n if (!sourceAtaInfo) {\n throw new Error(\n `No token account found for ${asset}. Please ensure you have USDC in your wallet.`\n );\n }\n\n // Verify destination ATA exists\n const destAtaInfo = await connection.getAccountInfo(destinationAta, 'confirmed');\n if (!destAtaInfo) {\n throw new Error(\n `Seller token account not found. The seller (${payTo}) must have a USDC account.`\n );\n }\n\n // 4. TransferChecked instruction\n const amountBigInt = BigInt(amount);\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amountBigInt,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash('confirmed');\n\n // Compile to V0 message (feePayer is facilitator)\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create and sign transaction\n const transaction = new VersionedTransaction(message);\n const signedTx = await wallet.signTransaction(transaction);\n\n this.log('Transaction signed successfully');\n\n return {\n serialized: Buffer.from(signedTx.serialize()).toString('base64'),\n };\n }\n}\n\n/**\n * Create a Solana adapter instance\n */\nexport function createSolanaAdapter(config?: AdapterConfig): SolanaAdapter {\n return new SolanaAdapter(config);\n}\n\n\n\n","/**\n * EVM Chain Adapter\n *\n * Implements the ChainAdapter interface for EVM networks (Base, Ethereum, Arbitrum, etc.)\n * Uses EIP-712 typed data signing for x402 v2 payments.\n */\n\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for EVM chains\n */\nexport const BASE_MAINNET = 'eip155:8453';\nexport const BASE_SEPOLIA = 'eip155:84532';\nexport const ETHEREUM_MAINNET = 'eip155:1';\nexport const ARBITRUM_ONE = 'eip155:42161';\n\n/**\n * Chain IDs by CAIP-2 network\n */\nconst CHAIN_IDS: Record<string, number> = {\n [BASE_MAINNET]: 8453,\n [BASE_SEPOLIA]: 84532,\n [ETHEREUM_MAINNET]: 1,\n [ARBITRUM_ONE]: 42161,\n};\n\n/**\n * Default RPC URLs\n * Base mainnet uses Dexter's RPC proxy for reliability and zero-config setup\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [BASE_MAINNET]: 'https://api.dexter.cash/api/base/rpc',\n [BASE_SEPOLIA]: 'https://sepolia.base.org',\n [ETHEREUM_MAINNET]: 'https://eth.llamarpc.com',\n [ARBITRUM_ONE]: 'https://arb1.arbitrum.io/rpc',\n};\n\n/**\n * USDC addresses by chain (for reference)\n */\nexport const USDC_ADDRESSES: Record<string, string> = {\n [BASE_MAINNET]: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n [ETHEREUM_MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ARBITRUM_ONE]: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n};\n\n/**\n * EVM wallet interface (compatible with wagmi, ethers, viem)\n */\nexport interface EvmWallet {\n /** Wallet address */\n address: string;\n /** Chain ID currently connected to */\n chainId?: number;\n /**\n * Sign typed data (EIP-712)\n * This is the primary signing method for x402 EVM payments\n */\n signTypedData?(params: {\n domain: Record<string, unknown>;\n types: Record<string, unknown[]>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Alternative: Send transaction directly\n * Used if signTypedData is not available\n */\n sendTransaction?(params: {\n to: string;\n data: string;\n value?: bigint;\n }): Promise<string>;\n}\n\n/**\n * Check if an object is a valid EVM wallet\n */\nexport function isEvmWallet(wallet: unknown): wallet is EvmWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'address' in w &&\n typeof w.address === 'string' &&\n w.address.startsWith('0x')\n );\n}\n\n// ERC20 balanceOf function selector: 0x70a08231\n\n/**\n * EVM Chain Adapter\n */\nexport class EvmAdapter implements ChainAdapter {\n readonly name = 'EVM';\n readonly networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:evm]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle exact CAIP-2\n if (this.networks.includes(network)) return true;\n // Legacy format\n if (network === 'base') return true;\n if (network === 'ethereum') return true;\n if (network === 'arbitrum') return true;\n // Check if it starts with 'eip155:'\n if (network.startsWith('eip155:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy\n if (network === 'base') return DEFAULT_RPC_URLS[BASE_MAINNET];\n if (network === 'ethereum') return DEFAULT_RPC_URLS[ETHEREUM_MAINNET];\n if (network === 'arbitrum') return DEFAULT_RPC_URLS[ARBITRUM_ONE];\n return DEFAULT_RPC_URLS[BASE_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isEvmWallet(wallet)) return null;\n return wallet.address;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isEvmWallet(wallet)) return false;\n return !!wallet.address;\n }\n\n private getChainId(network: string): number {\n if (CHAIN_IDS[network]) return CHAIN_IDS[network];\n // Try to extract from CAIP-2\n if (network.startsWith('eip155:')) {\n const chainIdStr = network.split(':')[1];\n return parseInt(chainIdStr, 10);\n }\n // Defaults\n if (network === 'base') return 8453;\n if (network === 'ethereum') return 1;\n if (network === 'arbitrum') return 42161;\n return 8453; // Default to Base\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isEvmWallet(wallet) || !wallet.address) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n\n try {\n // Use eth_call to check ERC20 balance\n const data = this.encodeBalanceOf(wallet.address);\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: accept.asset,\n data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = (await response.json()) as { error?: unknown; result?: string };\n if (result.error || !result.result) {\n return 0;\n }\n\n const balance = BigInt(result.result);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(balance) / Math.pow(10, decimals);\n } catch {\n return 0;\n }\n }\n\n private encodeBalanceOf(address: string): string {\n // Function selector for balanceOf(address)\n const selector = '0x70a08231';\n // Pad address to 32 bytes\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, '0');\n return selector + paddedAddress;\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n _rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isEvmWallet(wallet)) {\n throw new Error('Invalid EVM wallet');\n }\n if (!wallet.address) {\n throw new Error('Wallet not connected');\n }\n\n const { payTo, asset, extra } = accept;\n const amount = accept.amount || accept.maxAmountRequired;\n if (!amount) {\n throw new Error('Missing amount in payment requirements');\n }\n\n this.log('Building EVM transaction:', {\n from: wallet.address,\n to: payTo,\n amount,\n asset,\n network: accept.network,\n });\n\n // For x402 v2 EVM payments, we use EIP-712 typed data signing\n // The facilitator will execute the transfer on behalf of the user\n\n const chainId = this.getChainId(accept.network);\n\n // Build the EIP-712 typed data\n // This matches what Dexter's facilitator expects\n const domain = {\n name: extra?.name ?? 'USD Coin',\n version: extra?.version ?? '2',\n chainId: BigInt(chainId),\n verifyingContract: asset as `0x${string}`,\n };\n\n const types = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n // Generate a random nonce (32 bytes hex)\n const nonce = '0x' + [...Array(32)]\n .map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0'))\n .join('') as `0x${string}`;\n\n const now = Math.floor(Date.now() / 1000);\n \n // Authorization object - values as strings for JSON, BigInts for signing\n const authorization = {\n from: wallet.address,\n to: payTo,\n value: amount, // string\n validAfter: String(now - 600), // 10 minutes before (matching upstream)\n validBefore: String(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n // Message for signing uses BigInt values\n const message = {\n from: wallet.address,\n to: payTo,\n value: BigInt(amount),\n validAfter: BigInt(now - 600),\n validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n if (!wallet.signTypedData) {\n throw new Error('Wallet does not support signTypedData (EIP-712)');\n }\n\n const signature = await wallet.signTypedData({\n domain: domain as Record<string, unknown>,\n types: types as Record<string, unknown[]>,\n primaryType: 'TransferWithAuthorization',\n message: message as Record<string, unknown>,\n });\n\n this.log('EIP-712 signature obtained');\n\n // Payload structure matches upstream @x402/evm exactly\n const payload = {\n authorization,\n signature,\n };\n\n return {\n serialized: JSON.stringify(payload),\n signature,\n };\n }\n}\n\n/**\n * Create an EVM adapter instance\n */\nexport function createEvmAdapter(config?: AdapterConfig): EvmAdapter {\n return new EvmAdapter(config);\n}\n\n","/**\n * Chain Adapters\n *\n * x402 v2 is designed to be chain-agnostic. Each adapter handles\n * the specifics of transaction building and signing for its chain.\n *\n * @example\n * ```typescript\n * import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';\n *\n * const adapters = [\n * createSolanaAdapter(),\n * createEvmAdapter(),\n * ];\n *\n * // Find adapter for a network\n * const adapter = adapters.find(a => a.canHandle('eip155:8453'));\n * ```\n */\n\n// Types\nexport type {\n ChainAdapter,\n AdapterConfig,\n SignedTransaction,\n GenericWallet,\n WalletSet,\n BalanceInfo,\n} from './types';\n\n// Solana\nexport {\n SolanaAdapter,\n createSolanaAdapter,\n isSolanaWallet,\n SOLANA_MAINNET,\n SOLANA_DEVNET,\n SOLANA_TESTNET,\n} from './solana';\nexport type { SolanaWallet } from './solana';\n\n// EVM\nexport {\n EvmAdapter,\n createEvmAdapter,\n isEvmWallet,\n BASE_MAINNET,\n BASE_SEPOLIA,\n ETHEREUM_MAINNET,\n ARBITRUM_ONE,\n} from './evm';\nexport type { EvmWallet } from './evm';\n\n/**\n * Create all default adapters\n */\nexport function createDefaultAdapters(verbose = false) {\n const { createSolanaAdapter } = require('./solana');\n const { createEvmAdapter } = require('./evm');\n return [\n createSolanaAdapter({ verbose }),\n createEvmAdapter({ verbose }),\n ];\n}\n\n/**\n * Find adapter that can handle a network\n */\nexport function findAdapter(\n adapters: import('./types').ChainAdapter[],\n network: string\n): import('./types').ChainAdapter | undefined {\n return adapters.find(adapter => adapter.canHandle(network));\n}\n\n\n\n"],"mappings":"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","names":["DEFAULT_RPC_URLS","createSolanaAdapter","createEvmAdapter"]}
@@ -39,7 +39,7 @@ var init_solana = __esm({
39
39
  SOLANA_DEVNET = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
40
40
  SOLANA_TESTNET = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
41
41
  DEFAULT_RPC_URLS = {
42
- [SOLANA_MAINNET]: "https://api.mainnet-beta.solana.com",
42
+ [SOLANA_MAINNET]: "https://api.dexter.cash/api/solana/rpc",
43
43
  [SOLANA_DEVNET]: "https://api.devnet.solana.com",
44
44
  [SOLANA_TESTNET]: "https://api.testnet.solana.com"
45
45
  };
@@ -235,7 +235,7 @@ var init_evm = __esm({
235
235
  [ARBITRUM_ONE]: 42161
236
236
  };
237
237
  DEFAULT_RPC_URLS2 = {
238
- [BASE_MAINNET]: "https://mainnet.base.org",
238
+ [BASE_MAINNET]: "https://api.dexter.cash/api/base/rpc",
239
239
  [BASE_SEPOLIA]: "https://sepolia.base.org",
240
240
  [ETHEREUM_MAINNET]: "https://eth.llamarpc.com",
241
241
  [ARBITRUM_ONE]: "https://arb1.arbitrum.io/rpc"