{"_id":"@b3dotfun/anyspend-x402-token-compat","_rev":"5-bdc1e941418e3ac1bff28c608fc2bb58","name":"@b3dotfun/anyspend-x402-token-compat","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@b3dotfun/anyspend-x402-token-compat","version":"0.1.0","keywords":["x402","anyspend","token","eip-2612","eip-3009","permit","compatibility","web3","payments","cryptocurrency"],"author":{"name":"b3-fun"},"license":"Apache-2.0","_id":"@b3dotfun/anyspend-x402-token-compat@0.1.0","maintainers":[{"name":"max-b3","email":"max@npclabs.org"},{"name":"npclabs","email":"sean@npclabs.org"},{"name":"gionpclabs","email":"gio@npclabs.org"},{"name":"alex-kaffetzakis","email":"alex@kaffetzakis.com"},{"name":"b3_david","email":"davidnguyen@npclabs.org"},{"name":"anqt-dev","email":"anqtran36@gmail.com"},{"name":"wojb3","email":"wojtek@npclabs.org"},{"name":"mitchmyburgh","email":"mitchmyburgh@gmail.com"},{"name":"trung.npclabs","email":"trung@npclabs.org"},{"name":"mikedutuandu","email":"mike@npclabs.org"}],"homepage":"https://github.com/b3-fun/anyspend-x402#readme","bugs":{"url":"https://github.com/b3-fun/anyspend-x402/issues"},"dist":{"shasum":"e9be2dcc284445acf63a870c32f77bf2bd2218e3","tarball":"https://registry.npmjs.org/@b3dotfun/anyspend-x402-token-compat/-/anyspend-x402-token-compat-0.1.0.tgz","fileCount":8,"integrity":"sha512-m+baCLTLqVhFdF0pq75qfo2X8Wi714gWIdLN72OwXKaqiB7B8ngf8hIQMM1RLVMnmIQioDsPl9j7t3SZi3lrlA==","signatures":[{"sig":"MEQCIFswV4Fz3JK222uJU1IzLS9jnZ1mQiynDIYM0sSnecM0AiBnc/X2W1QlPFIbrr5dRCgWBpX6WCYi/hziBeEI8wEezQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88373},"main":"./dist/cjs/index.js","_from":"file:b3dotfun-anyspend-x402-token-compat-0.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.mts","default":"./dist/esm/index.mjs"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"lint":"eslint . --ext .ts --fix","test":"vitest run","build":"tsup","start":"tsx --env-file=.env index.ts","watch":"tsc --watch","format":"prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"","lint:check":"eslint . --ext .ts","test:watch":"vitest","format:check":"prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\""},"_npmUser":{"name":"anqt-dev","email":"anqtran36@gmail.com"},"_resolved":"/private/var/folders/3h/t371gs6d3gj5fknk2x2qqs0h0000gn/T/aa090a6ecb6b5e79cbe090cd3feffd5d/b3dotfun-anyspend-x402-token-compat-0.1.0.tgz","_integrity":"sha512-m+baCLTLqVhFdF0pq75qfo2X8Wi714gWIdLN72OwXKaqiB7B8ngf8hIQMM1RLVMnmIQioDsPl9j7t3SZi3lrlA==","repository":{"url":"git+https://github.com/b3-fun/anyspend-x402.git","type":"git"},"_npmVersion":"10.9.0","description":"Token compatibility checker for EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) support","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^3.24.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.4.0","vite":"^6.2.6","eslint":"^9.24.0","vitest":"^3.0.5","prettier":"3.5.2","@eslint/js":"^9.24.0","typescript":"^5.7.3","@types/node":"^22.13.4","eslint-plugin-jsdoc":"^50.6.9","vite-tsconfig-paths":"^5.1.4","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.2.6","@typescript-eslint/parser":"^8.29.1","@typescript-eslint/eslint-plugin":"^8.29.1"},"_npmOperationalInternal":{"tmp":"tmp/anyspend-x402-token-compat_0.1.0_1762321083871_0.46517412612497","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@b3dotfun/anyspend-x402-token-compat","version":"0.1.1","keywords":["x402","anyspend","token","eip-2612","eip-3009","permit","compatibility","web3","payments","cryptocurrency"],"author":{"name":"b3-fun"},"license":"Apache-2.0","_id":"@b3dotfun/anyspend-x402-token-compat@0.1.1","maintainers":[{"name":"max-b3","email":"max@npclabs.org"},{"name":"npclabs","email":"sean@npclabs.org"},{"name":"gionpclabs","email":"gio@npclabs.org"},{"name":"alex-kaffetzakis","email":"alex@kaffetzakis.com"},{"name":"b3_david","email":"davidnguyen@npclabs.org"},{"name":"anqt-dev","email":"anqtran36@gmail.com"},{"name":"wojb3","email":"wojtek@npclabs.org"},{"name":"mitchmyburgh","email":"mitchmyburgh@gmail.com"},{"name":"trung.npclabs","email":"trung@npclabs.org"},{"name":"mikedutuandu","email":"mike@npclabs.org"}],"homepage":"https://github.com/b3-fun/anyspend-x402#readme","bugs":{"url":"https://github.com/b3-fun/anyspend-x402/issues"},"dist":{"shasum":"cdbabb1fe335198578f75f31f0cd7c148846c718","tarball":"https://registry.npmjs.org/@b3dotfun/anyspend-x402-token-compat/-/anyspend-x402-token-compat-0.1.1.tgz","fileCount":8,"integrity":"sha512-UT5LpMkgiQrv/aZmbftw9y9bPuQDf1ukVovW6iw2X6m1rnENb7TbqRjSzjRsJCtdVX+8wVufM3qEUQDWT1oHnA==","signatures":[{"sig":"MEYCIQCU2j0seMjy/2y1VeGC0mc5DzY5y1ZHbxLhY3+yGSaDXQIhAM6ucH5lbmcSliaicVPylYi9VKfOsucVkUHMmZIv+eNn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88373},"main":"./dist/cjs/index.js","_from":"file:b3dotfun-anyspend-x402-token-compat-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.mts","default":"./dist/esm/index.mjs"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"lint":"eslint . --ext .ts --fix","test":"vitest run","build":"tsup","start":"tsx --env-file=.env index.ts","watch":"tsc --watch","format":"prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"","lint:check":"eslint . --ext .ts","test:watch":"vitest","format:check":"prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\""},"_npmUser":{"name":"anqt-dev","email":"anqtran36@gmail.com"},"_resolved":"/private/var/folders/3h/t371gs6d3gj5fknk2x2qqs0h0000gn/T/58d8e59d59ce2baeef8d2f0fd2319fef/b3dotfun-anyspend-x402-token-compat-0.1.1.tgz","_integrity":"sha512-UT5LpMkgiQrv/aZmbftw9y9bPuQDf1ukVovW6iw2X6m1rnENb7TbqRjSzjRsJCtdVX+8wVufM3qEUQDWT1oHnA==","repository":{"url":"git+https://github.com/b3-fun/anyspend-x402.git","type":"git"},"_npmVersion":"10.9.0","description":"Token compatibility checker for EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) support","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^3.24.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.4.0","vite":"^6.2.6","eslint":"^9.24.0","vitest":"^3.0.5","prettier":"3.5.2","@eslint/js":"^9.24.0","typescript":"^5.7.3","@types/node":"^22.13.4","eslint-plugin-jsdoc":"^50.6.9","vite-tsconfig-paths":"^5.1.4","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.2.6","@typescript-eslint/parser":"^8.29.1","@typescript-eslint/eslint-plugin":"^8.29.1"},"_npmOperationalInternal":{"tmp":"tmp/anyspend-x402-token-compat_0.1.1_1762325103727_0.8682064783741412","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@b3dotfun/anyspend-x402-token-compat","version":"0.1.2","keywords":["x402","anyspend","token","eip-2612","eip-3009","permit","compatibility","web3","payments","cryptocurrency"],"author":{"name":"b3-fun"},"license":"Apache-2.0","_id":"@b3dotfun/anyspend-x402-token-compat@0.1.2","maintainers":[{"name":"max-b3","email":"max@npclabs.org"},{"name":"npclabs","email":"sean@npclabs.org"},{"name":"gionpclabs","email":"gio@npclabs.org"},{"name":"alex-kaffetzakis","email":"alex@kaffetzakis.com"},{"name":"b3_david","email":"davidnguyen@npclabs.org"},{"name":"anqt-dev","email":"anqtran36@gmail.com"},{"name":"wojb3","email":"wojtek@npclabs.org"},{"name":"mitchmyburgh","email":"mitchmyburgh@gmail.com"},{"name":"trung.npclabs","email":"trung@npclabs.org"},{"name":"mikedutuandu","email":"mike@npclabs.org"}],"homepage":"https://github.com/b3-fun/anyspend-x402#readme","bugs":{"url":"https://github.com/b3-fun/anyspend-x402/issues"},"dist":{"shasum":"2b9c57d1702c5862a2a9442460c222855c947102","tarball":"https://registry.npmjs.org/@b3dotfun/anyspend-x402-token-compat/-/anyspend-x402-token-compat-0.1.2.tgz","fileCount":8,"integrity":"sha512-nmYTwR6WPmGXMJNPmonzWlSDG/dukUmJlq6SN9ZVQ1KAKYGUC5stREh1mNoJq3BR3QPvth3uIQ72NjeUXNh4hQ==","signatures":[{"sig":"MEUCIHRq7GFsHeRguWioj1qtA4laoYQZZVEDuEFrdkSJNC2RAiEA2R+6dxnwMQORV923tFElywHF5NWmtYTMxfPuDDRtjFo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88663},"main":"./dist/cjs/index.js","_from":"file:b3dotfun-anyspend-x402-token-compat-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.mts","default":"./dist/esm/index.mjs"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"lint":"eslint . --ext .ts --fix","test":"vitest run","build":"tsup","start":"tsx --env-file=.env index.ts","watch":"tsc --watch","format":"prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"","lint:check":"eslint . --ext .ts","test:watch":"vitest","format:check":"prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\""},"_npmUser":{"name":"anqt-dev","email":"anqtran36@gmail.com"},"_resolved":"/private/var/folders/3h/t371gs6d3gj5fknk2x2qqs0h0000gn/T/33a14458b011052593e0e7f3638966ab/b3dotfun-anyspend-x402-token-compat-0.1.2.tgz","_integrity":"sha512-nmYTwR6WPmGXMJNPmonzWlSDG/dukUmJlq6SN9ZVQ1KAKYGUC5stREh1mNoJq3BR3QPvth3uIQ72NjeUXNh4hQ==","repository":{"url":"git+https://github.com/b3-fun/anyspend-x402.git","type":"git"},"_npmVersion":"10.9.0","description":"Token compatibility checker for EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) support","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^3.24.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.4.0","vite":"^6.2.6","eslint":"^9.24.0","vitest":"^3.0.5","prettier":"3.5.2","@eslint/js":"^9.24.0","typescript":"^5.7.3","@types/node":"^22.13.4","eslint-plugin-jsdoc":"^50.6.9","vite-tsconfig-paths":"^5.1.4","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.2.6","@typescript-eslint/parser":"^8.29.1","@typescript-eslint/eslint-plugin":"^8.29.1"},"_npmOperationalInternal":{"tmp":"tmp/anyspend-x402-token-compat_0.1.2_1762328513126_0.794744386272195","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@b3dotfun/anyspend-x402-token-compat","version":"0.1.3","keywords":["x402","anyspend","token","eip-2612","eip-3009","permit","compatibility","web3","payments","cryptocurrency"],"author":{"name":"b3-fun"},"license":"Apache-2.0","_id":"@b3dotfun/anyspend-x402-token-compat@0.1.3","maintainers":[{"name":"max-b3","email":"max@npclabs.org"},{"name":"npclabs","email":"sean@npclabs.org"},{"name":"gionpclabs","email":"gio@npclabs.org"},{"name":"alex-kaffetzakis","email":"alex@kaffetzakis.com"},{"name":"b3_david","email":"davidnguyen@npclabs.org"},{"name":"anqt-dev","email":"anqtran36@gmail.com"},{"name":"wojb3","email":"wojtek@npclabs.org"},{"name":"mitchmyburgh","email":"mitchmyburgh@gmail.com"},{"name":"trung.npclabs","email":"trung@npclabs.org"},{"name":"mikedutuandu","email":"mike@npclabs.org"}],"homepage":"https://github.com/b3-fun/anyspend-x402#readme","bugs":{"url":"https://github.com/b3-fun/anyspend-x402/issues"},"dist":{"shasum":"8581c44e4d1e35fdf1f5f1a9788ecc7d43d6cfa1","tarball":"https://registry.npmjs.org/@b3dotfun/anyspend-x402-token-compat/-/anyspend-x402-token-compat-0.1.3.tgz","fileCount":8,"integrity":"sha512-IuTs9uvpBZLD7iDPCrpCIT+AWcdNyvhe9nbZNNsZKei2embJOFEoLcD9H3ozSYFyWWX0YHZbCZbtNKhzlNZZMw==","signatures":[{"sig":"MEYCIQC6GSS0xYWJ3iX6TYwBN6F7UISwIyNLzRW7U0Mr9iBAXgIhAOritEJaFHRN/Ym8Km7vBGckoezapzAldM8gDVxnHLtv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88663},"main":"./dist/cjs/index.js","_from":"file:b3dotfun-anyspend-x402-token-compat-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.mts","default":"./dist/esm/index.mjs"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"lint":"eslint . --ext .ts --fix","test":"vitest run","build":"tsup","start":"tsx --env-file=.env index.ts","watch":"tsc --watch","format":"prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"","lint:check":"eslint . --ext .ts","test:watch":"vitest","format:check":"prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\""},"_npmUser":{"name":"anqt-dev","email":"anqtran36@gmail.com"},"_resolved":"/private/var/folders/3h/t371gs6d3gj5fknk2x2qqs0h0000gn/T/a65c5b298c0202ec60f1a8e7a0e6d4ba/b3dotfun-anyspend-x402-token-compat-0.1.3.tgz","_integrity":"sha512-IuTs9uvpBZLD7iDPCrpCIT+AWcdNyvhe9nbZNNsZKei2embJOFEoLcD9H3ozSYFyWWX0YHZbCZbtNKhzlNZZMw==","repository":{"url":"git+https://github.com/b3-fun/anyspend-x402.git","type":"git"},"_npmVersion":"10.9.0","description":"Token compatibility checker for EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) support","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^3.24.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.4.0","vite":"^6.2.6","eslint":"^9.24.0","vitest":"^3.0.5","prettier":"3.5.2","@eslint/js":"^9.24.0","typescript":"^5.7.3","@types/node":"^22.13.4","eslint-plugin-jsdoc":"^50.6.9","vite-tsconfig-paths":"^5.1.4","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.2.6","@typescript-eslint/parser":"^8.29.1","@typescript-eslint/eslint-plugin":"^8.29.1"},"_npmOperationalInternal":{"tmp":"tmp/anyspend-x402-token-compat_0.1.3_1763141594191_0.09578003926242262","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-05T05:38:03.803Z","modified":"2026-02-02T15:43:21.106Z","0.1.0":"2025-11-05T05:38:04.052Z","0.1.1":"2025-11-05T06:45:03.907Z","0.1.2":"2025-11-05T07:41:53.332Z","0.1.3":"2025-11-14T17:33:14.371Z"},"bugs":{"url":"https://github.com/b3-fun/anyspend-x402/issues"},"author":{"name":"b3-fun"},"license":"Apache-2.0","homepage":"https://github.com/b3-fun/anyspend-x402#readme","keywords":["x402","anyspend","token","eip-2612","eip-3009","permit","compatibility","web3","payments","cryptocurrency"],"repository":{"url":"git+https://github.com/b3-fun/anyspend-x402.git","type":"git"},"description":"Token compatibility checker for EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) support","maintainers":[{"email":"max@npclabs.org","name":"max-b3"},{"email":"sean@npclabs.org","name":"npclabs"},{"email":"gio@npclabs.org","name":"gionpclabs"},{"email":"davidnguyen@npclabs.org","name":"b3_david"},{"email":"anqtran36@gmail.com","name":"anqt-dev"},{"email":"mitchmyburgh@gmail.com","name":"mitchmyburgh"},{"email":"trung@npclabs.org","name":"trung.npclabs"},{"email":"mike@npclabs.org","name":"mikedutuandu"}],"readme":"# @b3dotfun/anyspend-x402-token-compat\n\nTypeScript/JavaScript client for checking ERC-20 token compatibility with EIP-2612 (Permit) and EIP-3009 (TransferWithAuthorization) standards.\n\n## Features\n\n- ✅ Check EIP-2612 (Permit) support for gasless approvals\n- ✅ Check EIP-3009 (TransferWithAuthorization) support for gasless transfers\n- ✅ Fetch complete token metadata (name, symbol, decimals, logo)\n- ✅ List tokens by chain with filtering support\n- ✅ Multi-chain support (Ethereum, Base, Polygon, Arbitrum, Optimism, BSC, Avalanche, B3, Abstract)\n- ✅ TypeScript-first with full type safety\n- ✅ Works in Node.js and browser environments\n- ✅ Zero dependencies (except `zod` for validation)\n\n## Installation\n\n```bash\nnpm install @b3dotfun/anyspend-x402-token-compat\n```\n\n```bash\npnpm add @b3dotfun/anyspend-x402-token-compat\n```\n\n```bash\nyarn add @b3dotfun/anyspend-x402-token-compat\n```\n\n## Quick Start\n\n```typescript\nimport { TokenCompatClient } from \"@b3dotfun/anyspend-x402-token-compat\";\n\nconst client = new TokenCompatClient();\n\n// Check if USDC on Base supports EIP-2612 (Permit)\nconst supportsPermit = await client.supportsEip2612(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\nconsole.log(\"USDC supports Permit:\", supportsPermit); // true\n\n// Get full token metadata\nconst metadata = await client.getTokenMetadata(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\nconsole.log(metadata);\n// {\n//   chainId: 8453,\n//   tokenAddress: \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n//   name: \"USD Coin\",\n//   symbol: \"USDC\",\n//   decimals: 6,\n//   logoUrl: \"https://...\",\n//   supportsEip2612: true,\n//   supportsEip3009: true\n// }\n```\n\n## API Reference\n\n### TokenCompatClient\n\nThe main client for interacting with the token metadata API.\n\n#### Constructor\n\n```typescript\nnew TokenCompatClient(options?: TokenCompatOptions)\n```\n\n**Options:**\n\n- `apiBaseUrl?: string` - Base URL for the API (default: `\"https://tokens.anyspend.com\"`)\n- `timeout?: number` - Request timeout in milliseconds (default: `10000`)\n- `fetch?: typeof fetch` - Custom fetch implementation (useful for Node.js < 18)\n\n**Example:**\n\n```typescript\nconst client = new TokenCompatClient({\n  apiBaseUrl: \"https://custom-api.example.com\",\n  timeout: 5000,\n});\n```\n\n### Methods\n\n#### getTokenMetadata\n\nFetch complete token metadata including EIP support information.\n\n```typescript\ngetTokenMetadata(\n  chain: ChainName | number,\n  tokenAddress: string\n): Promise<TokenMetadata>\n```\n\n**Parameters:**\n\n- `chain` - Chain name (`\"base\"`, `\"ethereum\"`, etc.) or chain ID (`8453`, `1`, etc.)\n- `tokenAddress` - Token contract address\n\n**Returns:** `Promise<TokenMetadata>`\n\n**Example:**\n\n```typescript\nconst metadata = await client.getTokenMetadata(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\n// Using chain ID\nconst metadata2 = await client.getTokenMetadata(\n  8453,\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n```\n\n#### supportsEip2612\n\nCheck if a token supports EIP-2612 (Permit) for gasless approvals.\n\n```typescript\nsupportsEip2612(\n  chain: ChainName | number,\n  tokenAddress: string\n): Promise<boolean>\n```\n\n**Example:**\n\n```typescript\nconst hasPermit = await client.supportsEip2612(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\nif (hasPermit) {\n  console.log(\"Token supports gasless approvals!\");\n}\n```\n\n#### supportsEip3009\n\nCheck if a token supports EIP-3009 (TransferWithAuthorization) for gasless transfers.\n\n```typescript\nsupportsEip3009(\n  chain: ChainName | number,\n  tokenAddress: string\n): Promise<boolean>\n```\n\n**Example:**\n\n```typescript\nconst hasTransferAuth = await client.supportsEip3009(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\nif (hasTransferAuth) {\n  console.log(\"Token supports gasless transfers!\");\n}\n```\n\n#### getEipSupport\n\nGet both EIP-2612 and EIP-3009 support status in a single call.\n\n```typescript\ngetEipSupport(\n  chain: ChainName | number,\n  tokenAddress: string\n): Promise<{\n  supportsEip2612: boolean;\n  supportsEip3009: boolean;\n}>\n```\n\n**Example:**\n\n```typescript\nconst support = await client.getEipSupport(\n  \"base\",\n  \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n);\n\nconsole.log(\"EIP-2612:\", support.supportsEip2612);\nconsole.log(\"EIP-3009:\", support.supportsEip3009);\n```\n\n#### listTokens\n\nList tokens on a specific chain with optional filtering and pagination.\n\n```typescript\nlistTokens(\n  chain: ChainName | number,\n  options?: TokenListOptions\n): Promise<TokenListResponse>\n```\n\n**Options:**\n\n- `limit?: number` - Number of tokens to return (default: `100`, max: `1000`)\n- `offset?: number` - Number of tokens to skip (default: `0`)\n- `eip2612?: boolean` - Filter for EIP-2612 compatible tokens\n- `eip3009?: boolean` - Filter for EIP-3009 compatible tokens\n\n**Example:**\n\n```typescript\n// Get first 50 tokens\nconst response = await client.listTokens(\"base\", { limit: 50 });\n\nconsole.log(`Found ${response.pagination.total} total tokens`);\nconsole.log(`Returned ${response.pagination.returned} tokens`);\n\nresponse.tokens.forEach((token) => {\n  console.log(`${token.symbol}: ${token.name}`);\n});\n\n// Get next page\nif (response.pagination.hasMore) {\n  const nextPage = await client.listTokens(\"base\", {\n    limit: 50,\n    offset: 50,\n  });\n}\n```\n\n#### listEip2612Tokens\n\nList all tokens that support EIP-2612 (Permit) on a specific chain.\n\n```typescript\nlistEip2612Tokens(\n  chain: ChainName | number,\n  options?: Omit<TokenListOptions, \"eip2612\" | \"eip3009\">\n): Promise<TokenListResponse>\n```\n\n**Example:**\n\n```typescript\n// Get all tokens with Permit support on Base\nconst permitTokens = await client.listEip2612Tokens(\"base\");\n\nconsole.log(\n  `Found ${permitTokens.pagination.total} tokens with Permit support`\n);\n```\n\n#### listEip3009Tokens\n\nList all tokens that support EIP-3009 (TransferWithAuthorization) on a specific chain.\n\n```typescript\nlistEip3009Tokens(\n  chain: ChainName | number,\n  options?: Omit<TokenListOptions, \"eip2612\" | \"eip3009\">\n): Promise<TokenListResponse>\n```\n\n**Example:**\n\n```typescript\n// Get all tokens with TransferWithAuthorization support\nconst transferAuthTokens = await client.listEip3009Tokens(\"base\");\n```\n\n#### listFullyCompatibleTokens\n\nList all tokens that support **both** EIP-2612 and EIP-3009 on a specific chain.\n\n```typescript\nlistFullyCompatibleTokens(\n  chain: ChainName | number,\n  options?: Omit<TokenListOptions, \"eip2612\" | \"eip3009\">\n): Promise<TokenListResponse>\n```\n\n**Example:**\n\n```typescript\n// Get all tokens that support both standards\nconst fullyCompatible = await client.listFullyCompatibleTokens(\"base\");\n\nfullyCompatible.tokens.forEach((token) => {\n  console.log(\n    `${token.symbol} supports both Permit and TransferWithAuthorization`\n  );\n});\n```\n\n#### getSupportedChains\n\nGet list of all supported blockchain networks.\n\n```typescript\ngetSupportedChains(): Promise<ChainInfo[]>\n```\n\n**Example:**\n\n```typescript\nconst chains = await client.getSupportedChains();\n\nchains.forEach((chain) => {\n  console.log(`${chain.fullName} (${chain.name}): Chain ID ${chain.chainId}`);\n  console.log(`  RPC Configured: ${chain.rpcConfigured}`);\n});\n```\n\n### Static Methods\n\n#### getChainName\n\nConvert chain ID to chain name.\n\n```typescript\nstatic getChainName(chainId: number): ChainName | undefined\n```\n\n**Example:**\n\n```typescript\nconst name = TokenCompatClient.getChainName(8453);\nconsole.log(name); // \"base\"\n```\n\n#### getChainId\n\nConvert chain name to chain ID.\n\n```typescript\nstatic getChainId(chainName: ChainName): number\n```\n\n**Example:**\n\n```typescript\nconst id = TokenCompatClient.getChainId(\"base\");\nconsole.log(id); // 8453\n```\n\n## Types\n\n### ChainName\n\nSupported blockchain networks:\n\n```typescript\ntype ChainName =\n  | \"ethereum\"\n  | \"bsc\"\n  | \"polygon\"\n  | \"base\"\n  | \"arbitrum\"\n  | \"optimism\"\n  | \"avalanche\"\n  | \"b3\"\n  | \"abstract\";\n```\n\n### TokenMetadata\n\n```typescript\ninterface TokenMetadata {\n  chainId: number;\n  tokenAddress: string;\n  name: string | null;\n  symbol: string | null;\n  decimals: number | null;\n  logoUrl: string | null;\n  supportsEip2612: boolean;\n  supportsEip3009: boolean;\n}\n```\n\n### TokenListResponse\n\n```typescript\ninterface TokenListResponse {\n  chain: string;\n  chainId: number;\n  filters: {\n    eip2612?: boolean;\n    eip3009?: boolean;\n  };\n  pagination: {\n    limit: number;\n    offset: number;\n    total: number;\n    returned: number;\n    hasMore: boolean;\n  };\n  tokens: TokenMetadata[];\n}\n```\n\n### ChainInfo\n\n```typescript\ninterface ChainInfo {\n  name: string;\n  chainId: number;\n  fullName: string;\n  rpcConfigured: boolean;\n}\n```\n\n## Supported Chains\n\n| Chain Name | Chain ID | Full Name         |\n| ---------- | -------- | ----------------- |\n| ethereum   | 1        | Ethereum          |\n| bsc        | 56       | BNB Smart Chain   |\n| polygon    | 137      | Polygon           |\n| base       | 8453     | Base              |\n| arbitrum   | 42161    | Arbitrum One      |\n| optimism   | 10       | Optimism          |\n| avalanche  | 43114    | Avalanche C-Chain |\n| b3         | 1113     | B3                |\n| abstract   | 2741     | Abstract          |\n\n## Use Cases\n\n### Gasless Approval Flow (EIP-2612)\n\n```typescript\nimport { TokenCompatClient } from \"@b3dotfun/anyspend-x402-token-compat\";\n\nasync function setupGaslessApproval(tokenAddress: string) {\n  const client = new TokenCompatClient();\n\n  // Check if token supports Permit\n  const hasPermit = await client.supportsEip2612(\"base\", tokenAddress);\n\n  if (hasPermit) {\n    // Use permit() instead of approve()\n    console.log(\"Using gasless permit signature\");\n    // ... implement permit logic\n  } else {\n    // Fall back to standard approval\n    console.log(\"Using standard approve transaction\");\n    // ... implement approve logic\n  }\n}\n```\n\n### Gasless Transfer Flow (EIP-3009)\n\n```typescript\nasync function setupGaslessTransfer(tokenAddress: string) {\n  const client = new TokenCompatClient();\n\n  const support = await client.getEipSupport(\"base\", tokenAddress);\n\n  if (support.supportsEip3009) {\n    // Use transferWithAuthorization\n    console.log(\"Using gasless transfer\");\n    // ... implement transfer with authorization\n  } else {\n    // Fall back to standard transfer\n    console.log(\"Using standard transfer\");\n    // ... implement transfer logic\n  }\n}\n```\n\n### Token Discovery\n\n```typescript\n// Find all tokens that support gasless operations\nconst client = new TokenCompatClient();\n\n// Get all fully compatible tokens\nconst tokens = await client.listFullyCompatibleTokens(\"base\");\n\nconsole.log(`Found ${tokens.pagination.total} fully compatible tokens`);\n\n// Display token options to user\ntokens.tokens.forEach((token) => {\n  console.log(`${token.symbol} - ${token.name}`);\n  console.log(`  Address: ${token.tokenAddress}`);\n  console.log(`  Supports Permit: ✅`);\n  console.log(`  Supports Transfer Auth: ✅`);\n});\n```\n\n## Error Handling\n\nThe client throws `TokenCompatError` for all errors:\n\n```typescript\nimport {\n  TokenCompatClient,\n  TokenCompatError,\n} from \"@b3dotfun/anyspend-x402-token-compat\";\n\nconst client = new TokenCompatClient();\n\ntry {\n  const metadata = await client.getTokenMetadata(\"base\", \"0x123\");\n} catch (error) {\n  if (error instanceof TokenCompatError) {\n    console.error(\"API Error:\", error.message);\n    console.error(\"Status Code:\", error.statusCode);\n    console.error(\"Response:\", error.responseBody);\n  } else {\n    console.error(\"Unexpected error:\", error);\n  }\n}\n```\n\n## Node.js < 18 Support\n\nFor Node.js versions before 18, you need to provide a fetch implementation:\n\n```typescript\nimport fetch from \"node-fetch\";\nimport { TokenCompatClient } from \"@b3dotfun/anyspend-x402-token-compat\";\n\nconst client = new TokenCompatClient({\n  fetch: fetch as any,\n});\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nApache-2.0\n\n## Links\n\n- [GitHub Repository](https://github.com/b3-fun/anyspend-x402)\n- [Issue Tracker](https://github.com/b3-fun/anyspend-x402/issues)\n- [NPM Package](https://www.npmjs.com/package/@b3dotfun/anyspend-x402-token-compat)\n\n## Related Packages\n\n- [@b3dotfun/anyspend-x402](https://www.npmjs.com/package/@b3dotfun/anyspend-x402) - Core x402 protocol implementation\n- [@b3dotfun/anyspend-x402-axios](https://www.npmjs.com/package/@b3dotfun/anyspend-x402-axios) - Axios integration\n- [@b3dotfun/anyspend-x402-fetch](https://www.npmjs.com/package/@b3dotfun/anyspend-x402-fetch) - Fetch API integration\n- [@b3dotfun/anyspend-x402-next](https://www.npmjs.com/package/@b3dotfun/anyspend-x402-next) - Next.js integration\n","readmeFilename":"README.md"}