{"_id":"@abiregistry/sdk","_rev":"5-670daec8098f712213c58422c6e5baa6","name":"@abiregistry/sdk","dist-tags":{"latest":"0.1.10"},"versions":{"0.1.2":{"name":"@abiregistry/sdk","version":"0.1.2","keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"author":{"name":"ABI Registry"},"license":"MIT","_id":"@abiregistry/sdk@0.1.2","maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"bin":{"abiregistry":"dist/cli.js"},"dist":{"shasum":"df733b7640c5dbf95db2316acc25267d3f4ace7f","tarball":"https://registry.npmjs.org/@abiregistry/sdk/-/sdk-0.1.2.tgz","fileCount":10,"integrity":"sha512-z8LdA/2zux8rzqU/u6dUM6QQLgmSorL0lFK51EbgQFLOt/I2VHAWdunlm7XzL7g0Plf4JGN0p6dtLafHzwpkMA==","signatures":[{"sig":"MEUCIQCO1RTPmsBmhX50etoOQ7oeWJSubkM6mwhpPXGLRLo4OwIgFEBk8I+OMveM3xGm/e9jN6YScgTkpsrx36TrCkasz5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170532},"main":"./dist/index.js","_from":"file:abiregistry-sdk-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","lint:fix":"eslint src --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"eborrallo","email":"borrallorodriguez@gmail.com"},"_resolved":"/tmp/9f55ca642f8a9c15ca52e8ad6b376c7f/abiregistry-sdk-0.1.2.tgz","_integrity":"sha512-z8LdA/2zux8rzqU/u6dUM6QQLgmSorL0lFK51EbgQFLOt/I2VHAWdunlm7XzL7g0Plf4JGN0p6dtLafHzwpkMA==","repository":{"url":"git+https://github.com/eborrallo/abiregistry-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","directories":{},"_nodeVersion":"20.19.5","dependencies":{"dotenv":"^17.2.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^1.6.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1762249284583_0.34527328047563266","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@abiregistry/sdk","version":"0.1.6","keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"author":{"name":"ABI Registry"},"license":"MIT","_id":"@abiregistry/sdk@0.1.6","maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"bin":{"abiregistry":"dist/cli.js"},"dist":{"shasum":"5a83ea3abea757ac51353eae6271193013e361f2","tarball":"https://registry.npmjs.org/@abiregistry/sdk/-/sdk-0.1.6.tgz","fileCount":10,"integrity":"sha512-8ptw9TbXK4iZkNgA6r+Tl5fEA32AbfLygcKJ7yYzpwxP90cXjbTjZ/brEo6+jdrAlwnDuQFeeH5aXTd/Qyttug==","signatures":[{"sig":"MEUCIQCLgn5SjHlndDBodmrPJWzd1hyM6v0gdOqMaIbpILEFBAIgFBw9a3JyD5LY7gYQ4BDM+/IaYbEqMCNMU/Hx1k0lVlY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177035},"main":"./dist/index.js","_from":"file:abiregistry-sdk-0.1.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","lint:fix":"eslint src --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"eborrallo","email":"borrallorodriguez@gmail.com"},"_resolved":"/tmp/77992f728b480813851f2675c34c15e4/abiregistry-sdk-0.1.6.tgz","_integrity":"sha512-8ptw9TbXK4iZkNgA6r+Tl5fEA32AbfLygcKJ7yYzpwxP90cXjbTjZ/brEo6+jdrAlwnDuQFeeH5aXTd/Qyttug==","repository":{"url":"git+https://github.com/eborrallo/abiregistry-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","directories":{},"_nodeVersion":"20.19.5","dependencies":{"dotenv":"^17.2.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^1.6.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.6_1762276096326_0.7214018053661746","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@abiregistry/sdk","version":"0.1.8","keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"author":{"name":"ABI Registry"},"license":"MIT","_id":"@abiregistry/sdk@0.1.8","maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"bin":{"abiregistry":"dist/cli.js"},"dist":{"shasum":"91f1b8eb3562935b0b700423f9000e6941398efc","tarball":"https://registry.npmjs.org/@abiregistry/sdk/-/sdk-0.1.8.tgz","fileCount":10,"integrity":"sha512-JPYvPy4kLuDaGn4r4V1Md6rLYTCXaIzGWt6Yq/s7PpnMFwr/KfPZl60b3cg/hl7YMAwi5WaV7VvFJ4304jbFoQ==","signatures":[{"sig":"MEUCIGcM8RZqu8uqImQ46b1b7wcGf1wRSo5n0IcRqBw8pivzAiEAucLptQsfZzp72oP4kPyeVZ8HNmrkIv8WbWP2QM3pRIo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193237},"main":"./dist/index.js","_from":"file:abiregistry-sdk-0.1.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","lint:fix":"eslint src --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"eborrallo","email":"borrallorodriguez@gmail.com"},"_resolved":"/tmp/2c0c6c2b0724f23495c27e3c35369166/abiregistry-sdk-0.1.8.tgz","_integrity":"sha512-JPYvPy4kLuDaGn4r4V1Md6rLYTCXaIzGWt6Yq/s7PpnMFwr/KfPZl60b3cg/hl7YMAwi5WaV7VvFJ4304jbFoQ==","repository":{"url":"git+https://github.com/eborrallo/abiregistry-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","directories":{},"_nodeVersion":"20.19.5","dependencies":{"dotenv":"^17.2.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^1.6.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.8_1762421798226_0.38514732463228074","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@abiregistry/sdk","version":"0.1.9","keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"author":{"name":"ABI Registry"},"license":"MIT","_id":"@abiregistry/sdk@0.1.9","maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"bin":{"abiregistry":"dist/cli.js"},"dist":{"shasum":"3d9450f79b41907ab2b389caae7d74f358d0ab6e","tarball":"https://registry.npmjs.org/@abiregistry/sdk/-/sdk-0.1.9.tgz","fileCount":10,"integrity":"sha512-NMBFJc6qwTOk/Xcjwxmtxx1FLjibJDyXe2P3o5vYgI4I3Uqp2FuYf8KGGnEoXxZ5v/XgKsvu47665lixtlf0KA==","signatures":[{"sig":"MEQCIBLP0MbdgOKmgRAeRaR1A4Ltq82RFdN582w+8FM3tF53AiAvx+WZQlmr2081vXVYoeF80nqDTEtqhQj1qQwAJ2pDtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197973},"main":"./dist/index.js","_from":"file:abiregistry-sdk-0.1.9.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","lint:fix":"eslint src --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"eborrallo","email":"borrallorodriguez@gmail.com"},"_resolved":"/tmp/dc4a27d5c11f5c0bc2e6d9d6c449ef91/abiregistry-sdk-0.1.9.tgz","_integrity":"sha512-NMBFJc6qwTOk/Xcjwxmtxx1FLjibJDyXe2P3o5vYgI4I3Uqp2FuYf8KGGnEoXxZ5v/XgKsvu47665lixtlf0KA==","repository":{"url":"git+https://github.com/eborrallo/abiregistry-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","directories":{},"_nodeVersion":"20.19.5","dependencies":{"dotenv":"^17.2.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^1.6.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.9_1762507777862_0.5980980532035682","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@abiregistry/sdk","version":"0.1.10","description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","bin":{"abiregistry":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"repository":{"type":"git","url":"git+https://github.com/eborrallo/abiregistry-sdk.git"},"bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","author":{"name":"ABI Registry"},"license":"MIT","devDependencies":{"@types/node":"^22.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","@vitest/coverage-v8":"^1.6.0","eslint":"^8.57.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^1.6.0"},"engines":{"node":">=18.0.0"},"dependencies":{"dotenv":"^17.2.3"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"eslint src","lint:fix":"eslint src --fix","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_id":"@abiregistry/sdk@0.1.10","_integrity":"sha512-QA+MpThaQLhHhyZxMPPnmciFjt9PaVg3hUcJD3r9jKNx+hH15lmYuj0ijvN8YnnyagckYizWXqp4bl4XEkWaKw==","_resolved":"/tmp/bb968cbdcfeb8199541713b2a76a6be8/abiregistry-sdk-0.1.10.tgz","_from":"file:abiregistry-sdk-0.1.10.tgz","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-QA+MpThaQLhHhyZxMPPnmciFjt9PaVg3hUcJD3r9jKNx+hH15lmYuj0ijvN8YnnyagckYizWXqp4bl4XEkWaKw==","shasum":"8fa05da25f6ebfa72c80981943be5aeb4ac9b282","tarball":"https://registry.npmjs.org/@abiregistry/sdk/-/sdk-0.1.10.tgz","fileCount":10,"unpackedSize":198999,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGvP6rjqpFr8hqFi4f2mF7gQMAXqDQybhGWFzmOxlqA7AiEAuyt+aUXhBez3hmKoGXUuQutYPfJDO5LT6UeGb17/q8M="}]},"_npmUser":{"name":"eborrallo","email":"borrallorodriguez@gmail.com"},"directories":{},"maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.10_1762510720976_0.6923388290172698"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-04T09:41:24.416Z","modified":"2025-11-07T10:18:41.393Z","0.1.2":"2025-11-04T09:41:24.788Z","0.1.6":"2025-11-04T17:08:16.535Z","0.1.8":"2025-11-06T09:36:38.443Z","0.1.9":"2025-11-07T09:29:38.109Z","0.1.10":"2025-11-07T10:18:41.146Z"},"bugs":{"url":"https://github.com/eborrallo/abiregistry-sdk/issues"},"author":{"name":"ABI Registry"},"license":"MIT","homepage":"https://github.com/eborrallo/abiregistry-sdk#readme","keywords":["abi","registry","smart-contracts","ethereum","web3","blockchain","solidity","typescript","viem","abi-registry","abiregistry","abiregistry-sdk"],"repository":{"type":"git","url":"git+https://github.com/eborrallo/abiregistry-sdk.git"},"description":"Official SDK for ABI Registry - Push and pull smart contract ABIs seamlessly","maintainers":[{"name":"eborrallo","email":"borrallorodriguez@gmail.com"}],"readme":"# @abiregistry/sdk\n\nOfficial TypeScript/JavaScript SDK for ABI Registry - Push and pull smart contract ABIs seamlessly with automatic TypeScript generation, version tracking, and multi-instance support.\n\n## Installation\n\n```bash\nnpm install @abiregistry/sdk\n# or\nyarn add @abiregistry/sdk\n# or\npnpm add @abiregistry/sdk\n```\n\n## Quick Start\n\n### CLI Usage (Recommended)\n\n```bash\n# Option 1: Use .env file (recommended)\necho \"ABI_REGISTRY_API_KEY=your-api-key\" > .env\n\n# Option 2: Export environment variable\nexport ABI_REGISTRY_API_KEY=\"your-api-key\"\n\n# Initialize config file\nnpx abiregistry init\n\n# Fetch ABI from Etherscan (NO API key needed for fetch)\nnpx abiregistry fetch --chain 1 --address 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 --name USDC\n\n# Fetch proxy contract (automatically gets implementation ABI)\nnpx abiregistry fetch --chain 1 --address 0xProxyAddress... --name MyToken --proxy\n\n# Or add contracts to abiregistry.config.json and run\nnpx abiregistry fetch\n\n# Setup Foundry integration (first time only)\nnpx abiregistry foundry init\n\n# Push Foundry deployments to registry\nnpx abiregistry foundry\n\n# Pull ABIs and generate TypeScript files\nnpx abiregistry pull\n```\n\n### Programmatic Usage\n\n```typescript\nimport { AbiRegistry } from '@abiregistry/sdk'\n\n// Initialize the client (API key has project permissions)\nconst client = new AbiRegistry({\n  apiKey: process.env.ABI_REGISTRY_API_KEY,\n})\n\n// Push an ABI (version auto-increments: 1, 2, 3...)\nconst result = await client.push({\n  contractName: 'MyContract',\n  address: '0x1234567890123456789012345678901234567890',\n  chainId: 1,\n  label: 'Production',  // Optional label\n  abi: [...], // Your ABI array\n})\n\nconsole.log(result.isDuplicate)  // true if ABI already exists\nconsole.log(result.abiId)        // ABI identifier\n\n// Pull ABIs and generate typed files\nawait client.pullAndGenerate({\n  outDir: 'abiregistry', // default\n  typescript: true,       // default\n})\n```\n\n### Using Generated Files\n\nThe SDK generates a typed registry for easy access:\n\n```typescript\nimport { contracts } from './abiregistry/registry'\n\n// Access by network name\nconst balance = await publicClient.readContract({\n  ...contracts.mainnet.USDC,\n  functionName: 'balanceOf',\n  args: [userAddress]\n})\n\n// Access by chain ID (same object)\nconst sameContract = contracts[1].USDC\n\n// Multiple instances of same contract (addresses array)\ncontracts.sepolia.MockERC20.addresses  // [\"0x123...\", \"0x456...\", \"0x789...\"]\ncontracts.sepolia.MockERC20.address    // Primary address (first in array)\n\n// Works great with different ABIs per network\ncontracts.mainnet.MyToken   // Mainnet deployment\ncontracts.sepolia.MyToken   // Sepolia deployment  \ncontracts[137].MyToken      // Polygon deployment\n```\n\n## Features\n\n- 🔍 **Fetch from Etherscan** - Automatically fetch ABIs from verified contracts (NO API key needed!)\n- 🔓 **Proxy Contract Support** - Automatically fetch implementation ABIs for proxy contracts\n- 🔨 **Foundry Integration** - Push deployment artifacts directly from Foundry broadcast folder\n- 🔮 **ERC-1967 Auto-Detection** - Zero-config proxy detection for OpenZeppelin & compatible proxies\n- 💎 **EIP-2535 Diamond Support** - Merge multiple interface ABIs for Diamond contracts\n- 📦 **Pull ABIs** - Download all ABIs from your project\n- 🎯 **TypeScript Generation** - Auto-generate typed contract files with full type safety\n- 📁 **Smart Grouping** - Identical ABIs deployed to multiple addresses automatically grouped\n- 🔄 **Auto-Increment Versioning** - Versions automatically increment (v1, v2, v3...)\n- 🏷️ **Custom Labels** - Add semantic labels to deployments (\"Production\", \"Staging\", etc.)\n- 🔐 **Duplicate Detection** - Automatically skips pushing identical ABIs\n- 🔐 **Secure Authentication** - API key-based authentication for push/pull\n- 🌐 **40+ Chain Support** - Ethereum, Polygon, Arbitrum, Base, Optimism, and more\n\n## Generated Files\n\nWhen you run `pullAndGenerate()`, the SDK creates:\n\n### TypeScript Output (default)\n\n```\ngenerated/\n├── index.ts              # Exports all contracts\n├── types.ts              # TypeScript type definitions\n├── my-contract.ts        # Individual contract file\n└── payment-processor.ts  # Another contract file\n```\n\nEach contract file includes:\n\n```typescript\n/**\n * MyContract\n * Network: Ethereum Mainnet\n * Chain ID: 1\n * Address: 0x1234... (or multiple addresses if deployed multiple times)\n * Version: v1\n */\n\nexport const myContractAbi = [...] as const\n\n// Single address export\nexport const myContractAddress = '0x1234...' as const\n\n// OR multiple addresses (when same ABI deployed multiple times)\nexport const myContractAddresses = [\n  \"0x1234...\",\n  \"0x5678...\",\n  \"0x9abc...\"\n] as const\nexport const myContractAddress = myContractAddresses[0]  // Primary\n\nexport const myContractChainId = 1\n\nexport const myContractConfig = {\n  address: myContractAddress,      // or addresses: myContractAddresses\n  abi: myContractAbi,\n  chainId: myContractChainId,\n} as const\n```\n\n### JavaScript Output\n\nSet `typescript: false` for plain JavaScript:\n\n```typescript\nawait client.pullAndGenerate({\n  outDir: 'contracts',\n  typescript: false,\n})\n```\n\n## CLI Reference\n\n### Commands\n\n#### `init`\nCreate a configuration file:\n```bash\nnpx abiregistry init\n```\n\nCreates `abiregistry.config.json`:\n```json\n{\n  \"outDir\": \"abiregistry\",\n  \"contracts\": [\n    {\n      \"chain\": 1,\n      \"address\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n      \"name\": \"USDC\"\n    }\n  ]\n}\n```\n\n#### `fetch`\nFetch ABIs from Etherscan:\n```bash\n# Fetch single contract\nnpx abiregistry fetch --chain 1 --address 0xA0b... --name USDC\n\n# Fetch all contracts from config file\nnpx abiregistry fetch\n```\n\nSupported chains:\n- `1` - Ethereum Mainnet\n- `11155111` - Sepolia Testnet\n\n**Note:** Etherscan API works without a key but has rate limits. Set `ETHERSCAN_API_KEY` for higher limits.\n\n#### `foundry`\nPush Foundry deployment artifacts to the registry:\n\n**First time setup:**\n```bash\n# Initialize Foundry config\nnpx abiregistry foundry init\n\n# If you have existing broadcasts, config is auto-generated!\n# Otherwise, edit abiregistry.config.json with your deploy scripts\n```\n\n**Usage:**\n```bash\n# Push all scripts from config (with confirmation)\nnpx abiregistry foundry\n\n# Add a label for this deployment\nnpx abiregistry foundry --label \"Post-Audit\"\n\n# Skip confirmation prompt\nnpx abiregistry foundry --yes\n\n# Override config and push specific script\nnpx abiregistry foundry --script DeployScript.s.sol\n```\n\nFeatures:\n- ✅ **Multi-script support** - Track multiple deploy scripts in config\n- ✅ **Auto-detect ERC1967 proxies** - Automatically detects and maps proxy deployments\n- ✅ **Manual proxy configuration** - Specify proxy implementations in config when needed\n- ✅ **EIP-2535 Diamond support** - Merge multiple interface ABIs for Diamond contracts\n- ✅ **Multi-chain support** - Detects and pushes all chain deployments automatically\n- ✅ Automatically reads from `broadcast/` folder and extracts deployed contract ABIs\n- ✅ Extracts deployment timestamps from Foundry broadcast data\n- ✅ Auto-increments version numbers (1, 2, 3...)\n- ✅ Detects and skips duplicate ABIs automatically\n- ✅ Shows confirmation table before pushing (use `--yes` to skip)\n- ✅ Smart broadcast path detection (handles both old and new Foundry formats)\n\n#### `pull`\nPull ABIs and generate files:\n```bash\n# Pull with TypeScript (default)\nnpx abiregistry pull\n\n# Pull with JavaScript\nnpx abiregistry pull --js\n\n# Custom output directory\nnpx abiregistry pull --out ./contracts\n```\n\n### Configuration\n\nConfiguration sources (in priority order, highest to lowest):\n\n1. **Command-line flags** - `--api-key`, `--out`, `--script`, etc.\n2. **Environment variables** - `ABI_REGISTRY_API_KEY`, `process.env.*`\n3. **Config file** - `abiregistry.config.json` (optional settings)\n4. **`.env` file** - Auto-loaded from project root (lowest priority)\n\n**Environment Variable (Required):**\n\n**Option 1: Using `.env` file (Recommended)**\n```bash\n# Create .env file in your project root\necho \"ABI_REGISTRY_API_KEY=your-api-key-here\" > .env\n\n# Add to .gitignore (IMPORTANT!)\necho \".env\" >> .gitignore\necho \".env.local\" >> .gitignore\n\n# The CLI will automatically load this\nnpx abiregistry fetch\n```\n\n**Option 2: Using environment variable**\n```bash\n# Export in your shell\nexport ABI_REGISTRY_API_KEY=\"your-api-key\"\n\n# Or prefix the command\nABI_REGISTRY_API_KEY=\"your-api-key\" npx abiregistry fetch\n```\n\n**Supported environment variable names:**\n- `ABI_REGISTRY_API_KEY` (recommended)\n- `ABIREGISTRY_API_KEY` (alternative)\n- `API_KEY` (fallback)\n\n**Config File (Optional):**\n\nCreate with `npx abiregistry foundry init`, then customize:\n\n```json\n{\n  \"foundry\": {\n    \"scripts\": [\n      {\n        \"name\": \"Deploy.s.sol\",\n        \"contracts\": [\n          { \"name\": \"MyToken\" },\n          { \"name\": \"MyNFT\" },\n          {\n            \"name\": \"TokenProxy\",\n            \"proxy\": { \"implementation\": \"TokenV1\" }\n          }\n        ]\n      },\n      {\n        \"name\": \"DeployGovernance.s.sol\",\n        \"contracts\": [\n          {\n            \"name\": \"GovernanceProxy\",\n            \"proxy\": { \"implementation\": \"GovernorV1\" }\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n**Foundry Config Structure:**\n- `scripts` - Array of deploy scripts to track\n  - `name` - Script file name (e.g., \"Deploy.s.sol\")\n  - `contracts` - Array of contracts to push from this script (optional)\n    - `name` - Contract name\n    - `proxy` - Proxy configuration (optional, but auto-detected for ERC-1967)\n      - `implementation` - Implementation contract name to load ABI from\n      - `interfaces` - Array of interface names to merge for EIP-2535 Diamond contracts\n\n---\n\n### **Proxy Pattern Support**\n\n#### **ERC-1967 Transparent Proxy (Auto-Detected) ✨**\n\nThe SDK **automatically detects** [ERC-1967](https://eip.tools/eip/1967) proxies in your Foundry broadcasts - **zero configuration needed!**\n\n**How it works:**\n1. SDK scans broadcast transactions for `CALL` operations with small `initCode`\n2. Links the proxy address to the previous `CREATE` transaction (the implementation)\n3. Automatically loads the implementation ABI for the proxy address\n4. Names it `{ImplementationName}Proxy` in the registry\n\n**Example broadcast pattern:**\n```json\n// 1. Deploy implementation\n{ \"transactionType\": \"CREATE\", \"contractName\": \"TokenV1\", \"address\": \"0x1111...\" }\n\n// 2. Deploy proxy (auto-detected by SDK!)\n{\n  \"transactionType\": \"CALL\",\n  \"additionalContracts\": [{\n    \"address\": \"0x2222...\",  // ← Proxy address\n    \"initCode\": \"0x607f3d...\"  // ← Small init code (ERC-1967 pattern)\n  }]\n}\n```\n\n**Result:** SDK automatically creates `TokenV1Proxy` with the `TokenV1` ABI at address `0x2222...`\n\n**Manual override** (only if needed):\n```json\n{\n  \"foundry\": {\n    \"scripts\": [{\n      \"name\": \"Deploy.s.sol\",\n      \"contracts\": [{\n        \"name\": \"CustomProxyName\",\n        \"proxy\": { \"implementation\": \"TokenV1\" }\n      }]\n    }]\n  }\n}\n```\n\n---\n\n#### **EIP-2535 Diamond Standard Support:**\n\nFor Diamond contracts, you can merge multiple interface ABIs:\n\n```json\n{\n  \"foundry\": {\n    \"scripts\": [\n      {\n        \"name\": \"DeployDiamond.s.sol\",\n        \"contracts\": [\n          {\n            \"name\": \"DiamondProxy\",\n            \"proxy\": {\n              \"implementation\": \"Diamond\",\n              \"interfaces\": [\"IDiamondLoupe\", \"IOwnership\", \"IMyFacet\"]\n            }\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nThe SDK will:\n1. Load the `Diamond` implementation ABI\n2. Load each interface ABI from `out/` folder\n3. Merge all ABIs intelligently (removing duplicates)\n4. Push the complete merged ABI to the registry\n\nThis is perfect for [EIP-2535 Diamond contracts](https://eip.tools/eip/2535) where the proxy combines multiple facets!\n\n**Features:**\n- ✅ Track multiple deploy scripts\n- ✅ Filter specific contracts per script\n- ✅ **Auto-detects ERC1967 proxies** (no manual config needed!)\n- ✅ Manual proxy configuration for complex cases\n- ✅ Multi-chain support (automatically pushes all chain deployments)\n- ✅ Omit `contracts` array to push all contracts from a script\n\n**Smart Configuration:**\nWhen you run `npx abiregistry foundry init`, the SDK:\n1. **Scans your `broadcast/` folder** for existing deployments\n2. **Auto-generates config** from discovered scripts and contracts\n3. **Detects proxies automatically** and adds them to the config\n4. Falls back to template if no broadcasts found\n\n**Proxy Detection:**\nThe SDK automatically detects ERC1967 proxies by analyzing the broadcast file structure. When a proxy is deployed, it will:\n1. Detect the proxy address from `additionalContracts`\n2. Map it to the implementation contract\n3. Load the implementation ABI for the proxy address\n\nManual proxy configuration is only needed for non-standard proxy patterns.\n\n**Note:** Versions are auto-incremented by the server (1, 2, 3...). Use `--label` to add semantic meaning.\n\n⚠️ **Security**: \n- ✅ API key contains your project permissions\n- ✅ Never commit API keys - use `.env` files\n- ✅ Add `.env` to `.gitignore`\n\n## API Reference\n\n### `new AbiRegistry(config)`\n\nCreate a new registry client.\n\n```typescript\nconst client = new AbiRegistry({\n  apiKey: 'your-api-key',\n})\n```\n\n### `push(input)`\n\nUpload an ABI to the registry. Returns info about whether it was a new version or duplicate.\n\n```typescript\nconst result = await client.push({\n  contractName: 'MyContract',\n  address: '0x...',\n  chainId: 1,\n  label: 'Production',  // Optional: \"Production\", \"Staging\", \"Post-Audit\", etc.\n  deployedAt: new Date(),  // Optional: deployment timestamp\n  abi: [...],\n})\n\nconsole.log(result.isDuplicate)  // true if this exact ABI already exists\nconsole.log(result.abiId)        // Unique ABI identifier\n```\n\n**Note:** Version numbers are auto-incremented (v1, v2, v3...). You cannot set them manually.\n\n### `pull()`\n\nFetch all ABIs from the registry.\n\n```typescript\nconst abis = await client.pull()\n```\n\n### `pullAndGenerate(options)`\n\nPull ABIs and generate typed contract files.\n\n```typescript\nawait client.pullAndGenerate({\n  outDir: 'generated',  // Output directory (default: 'generated')\n  typescript: true,     // Generate TypeScript (default: true)\n})\n```\n\n### `getAbi(abiId)`\n\nGet a specific ABI by ID.\n\n```typescript\nconst abi = await client.getAbi('abi-id')\n```\n\n### `getByNetwork(network)`\n\nGet all ABIs for a specific network.\n\n```typescript\nconst mainnetAbis = await client.getByNetwork('mainnet')\n```\n\n### `getByAddress(address)`\n\nGet all ABIs for a specific contract address.\n\n```typescript\nconst abis = await client.getByAddress('0x...')\n```\n\n## Usage with Web3 Libraries\n\n### With Viem\n\n```typescript\nimport { createPublicClient, http } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { myContractConfig } from './generated/my-contract'\n\nconst client = createPublicClient({\n  chain: mainnet,\n  transport: http(),\n})\n\nconst result = await client.readContract({\n  ...myContractConfig,\n  functionName: 'balanceOf',\n  args: ['0x...'],\n})\n```\n\n### With Ethers.js\n\n```typescript\nimport { ethers } from 'ethers'\nimport { myContractAbi, myContractAddress } from './generated/my-contract'\n\nconst provider = new ethers.JsonRpcProvider('https://...')\nconst contract = new ethers.Contract(\n  myContractAddress,\n  myContractAbi,\n  provider\n)\n\nconst balance = await contract.balanceOf('0x...')\n```\n\n### With Wagmi\n\n```typescript\nimport { useReadContract } from 'wagmi'\nimport { myContractConfig } from './generated/my-contract'\n\nfunction Component() {\n  const { data } = useReadContract({\n    ...myContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x...'],\n  })\n  \n  return <div>Balance: {data?.toString()}</div>\n}\n```\n\n## Documentation\n\nFull documentation is available at [https://abiregistry.com/docs](https://abiregistry.com/docs)\n\n## License\n\nMIT\n\n","readmeFilename":"README.md"}