{"_id":"@bbuilders/djeon402-sdk-node","_rev":"8-8df2fe39e03a9461dd60ff02a9343689","name":"@bbuilders/djeon402-sdk-node","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.1":{"name":"@bbuilders/djeon402-sdk-node","version":"1.0.1","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"DJEON402 Team"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@1.0.1","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"homepage":"https://github.com/yourorg/dongjeon402-sdk#readme","bugs":{"url":"https://github.com/yourorg/dongjeon402-sdk/issues"},"dist":{"shasum":"620c3f51477c266437cecbce6609d84bee8a92c2","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-1.0.1.tgz","fileCount":8,"integrity":"sha512-N/W34CgNB/9kw6nEdoGL4Btri0ehemDn1USzm7/TatjaJxPm4358GBF+N+DexNZbQwoh0s6/pHQ/ORI8/yGrtQ==","signatures":[{"sig":"MEUCIQC6I+DW06uFyHcf3sjWCRjzYDWmTzgsvn/QF7elwtEp+QIgW4BAnGlJ/2Gctx1Ky1GVXcwUvuwbTR71L0Vg/hAlaE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295464},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"repository":{"url":"git+https://github.com/yourorg/dongjeon402-sdk.git","type":"git","directory":"packages/sdk-node"},"_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"workspace:*"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_1.0.1_1775536806700_0.73305878032327","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bbuilders/djeon402-sdk-node","version":"1.0.2","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"DJEON402 Team"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@1.0.2","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"homepage":"https://github.com/yourorg/dongjeon402-sdk#readme","bugs":{"url":"https://github.com/yourorg/dongjeon402-sdk/issues"},"dist":{"shasum":"665ff93bae40e82fac0ea72977bfe1a911557423","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-1.0.2.tgz","fileCount":8,"integrity":"sha512-J8AU0h9zjU+MSO/NUlkIIOzXEpgWO9Y3ATB6t4L5N+7QcCYo6xKkCpqlRqlLJu3JOWCxZZaT1dfhoI3PGTbbew==","signatures":[{"sig":"MEUCIQDIdfC0IUf4GBaczyxUaV6cKcc89W6atjNUhmVqUWGZSgIgcZkLbqI5VojYLHU7GNtewQ+b6sG5HJWtDHcFdc4QLoA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295517},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"repository":{"url":"git+https://github.com/yourorg/dongjeon402-sdk.git","type":"git","directory":"packages/sdk-node"},"_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"workspace:*"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_1.0.2_1775537778013_0.4033053387899228","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bbuilders/djeon402-sdk-node","version":"1.0.3","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@1.0.3","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"dist":{"shasum":"1ee77dd6be2d3de0c5e6e530dc5787b967fac0ca","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-1.0.3.tgz","fileCount":8,"integrity":"sha512-RZ4VbVgFnaqRSkYbUdeBlup1WzW86tkMC4PkP9wktirrjHunvEHfJZsN3tPA4OjUd/hufaFd3ahveLPpYBTNVg==","signatures":[{"sig":"MEYCIQDwO5xzlbn2slQj7qaqPsl8wdGMX1hu7NqxR2/7vCiSHwIhAO15HTwUfHcjlRRQn5SoO5hh5+3c9hqrIIrk/K6Q1RoJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295393},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"workspace:*"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_1.0.3_1775541119872_0.16740700780653506","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bbuilders/djeon402-sdk-node","version":"1.0.4","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@1.0.4","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"dist":{"shasum":"877bbf442413a7d85b19fe7aec610ffac76e594b","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-1.0.4.tgz","fileCount":8,"integrity":"sha512-M2po/iX8rSerXK4wQkomEcqr3YLTz/qhx751MhtmuUp0AFP7kGhBNWvj74dN/YW5seZkIUVZ/TXIPYMVkcLD1g==","signatures":[{"sig":"MEYCIQDTl7YtEPKCFqxxzDJKinp/trvZvd3syupTYZ9Kf37ZBwIhALrA9IOzzhp/M7Bki6wiesfgpVIK1x5lA1e6LzzgCz1B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310130},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_1.0.4_1775561011732_0.7163565858729202","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bbuilders/djeon402-sdk-node","version":"2.0.0","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@2.0.0","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"dist":{"shasum":"dd9a466335846aad8ed0bec26fac5c50bf174c29","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-2.0.0.tgz","fileCount":8,"integrity":"sha512-sdUzXmDGN5VNkVX+Y8gcQSZDw8RVc3iLEQ90BfAlO5GSRzSB8SrywO+1LO5M16xetdmvxVH4YVhB/mxyP8PI0Q==","signatures":[{"sig":"MEUCIQDvLYcHCabqMtD+vx7aQ2e+P7S9iHhCxkahZVp4dS3j3gIgNxmA0M75/KJNCgCj6PUONHZQiJ/UKqJ3z3xmPKs8OUA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":318665},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"deprecated":"Broken ESM exports (points to missing .mjs). Use 2.0.1.","_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_2.0.0_1784531210801_0.8264396009478023","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bbuilders/djeon402-sdk-node","version":"2.0.1","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","_id":"@bbuilders/djeon402-sdk-node@2.0.1","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"dist":{"shasum":"3afeff97dfee9b6ed80a8ba8106ddee5660a9315","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-2.0.1.tgz","fileCount":8,"integrity":"sha512-n3btZckyHHhG2SmQKJsGovJvBpmKsovbXtTzhA/gWbEUIufZKTjfyah1mQcBJIao2eH8VII+xwASnGFOhNsufw==","signatures":[{"sig":"MEQCIGXf4UKZ1XDaaGCxHnpijucWcT22nksAYgVz4E8k66twAiAKf9ZPdYE5SXSsLXQDZVgcQ9YoLhfYYvk/MLTlCNW81A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":318662},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:coverage":"vitest --coverage"},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"_npmVersion":"11.3.0","description":"DJEON402 SDK for Node.js and Backend applications","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@bbuilders/djeon402-core":"2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","viem":"^2.0.0","eslint":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"viem":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/djeon402-sdk-node_2.0.1_1784534273063_0.5981451358164651","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@bbuilders/djeon402-sdk-node","version":"2.1.0","description":"DJEON402 SDK for Node.js and Backend applications","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest","test:coverage":"vitest --coverage","typecheck":"tsc --noEmit","lint":"eslint src","clean":"rm -rf dist"},"dependencies":{"@bbuilders/djeon402-core":"2.1.0"},"peerDependencies":{"viem":"^2.0.0"},"devDependencies":{"@types/node":"^20.0.0","eslint":"^8.0.0","tsup":"^8.0.0","typescript":"^5.0.0","viem":"^2.0.0","vitest":"^1.0.0"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"_id":"@bbuilders/djeon402-sdk-node@2.1.0","_nodeVersion":"24.2.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-0HeUUkbsGHRFaYshDlS/cn8LJajJ65ncbCfMWe5Tn87QEi9nB2Pz/WgdSiBPcM2GIWAG2TiaSpGnUcBDUVhxzQ==","shasum":"d616819d12d89fcc6776eb733c9859ce36c4a32c","tarball":"https://registry.npmjs.org/@bbuilders/djeon402-sdk-node/-/djeon402-sdk-node-2.1.0.tgz","fileCount":8,"unpackedSize":363970,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCqoQkduLqLDh/wyQyXRJ7LJP/oDN95VdgeGhfA6umGtAIgcH1x+chOdyZd/PWuQLK9TEu833Yj9hNtgYOsX3ufVHE="}]},"_npmUser":{"name":"b-builders","email":"dev@bbuilders.xyz"},"directories":{},"maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/djeon402-sdk-node_2.1.0_1784988106100_0.16787775717484155"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T04:40:06.598Z","modified":"2026-07-25T14:01:46.419Z","1.0.1":"2026-04-07T04:40:06.943Z","1.0.2":"2026-04-07T04:56:18.181Z","1.0.3":"2026-04-07T05:52:00.020Z","1.0.4":"2026-04-07T11:23:31.877Z","2.0.0":"2026-07-20T07:06:50.962Z","2.0.1":"2026-07-20T07:57:53.237Z","2.1.0":"2026-07-25T14:01:46.244Z"},"author":{"name":"bbuilders","email":"dev@bbuilders.xyz"},"license":"MIT","keywords":["djeon402","dongjeon","node","backend","server","erc20","kyc","x402","ethereum"],"description":"DJEON402 SDK for Node.js and Backend applications","maintainers":[{"name":"b-builders","email":"dev@bbuilders.xyz"}],"readme":"# @bbuilders/djeon402-sdk-node\n\nOfficial Node.js SDK for DJEON402 token - designed for backend and server-side applications.\n\n## What's New in 2.0\n\n**Breaking changes:**\n\n- Token decimals are 6 (USDC/x402 convention) — USD/amount conversions use `parseTokenAmount` (no more float precision loss)\n- `kyc.checkDailyLimit` now returns the real allow/deny boolean (simulates first, records on-chain only when allowed; caller must be KYC admin or approved provider)\n- Custom chain ids now get a proper chain definition (previously any non-Base chain was signed as Foundry/31337)\n\n**New:**\n\n- `kyc.verify` accepts an optional `kycHash`; when omitted it is derived deterministically from `documents` (no more random placeholder hash)\n\n## Overview\n\n`@bbuilders/djeon402-sdk-node` provides a comprehensive, type-safe interface for interacting with DJEON402 smart contracts from Node.js environments. It handles all the complexity of blockchain interactions, signing, and transaction management.\n\n**Key Features:**\n- Full ERC-20 token operations (transfer, approve, mint, burn)\n- Admin functions (roles, blacklist, pause/unpause)\n- KYC management (verify, check status, limits)\n- x402/EIP-3009 gasless transactions\n- Built on viem for type safety and performance\n- Server-side signing with private keys\n- Support for Foundry (Anvil), Base, and custom EVM networks\n\n## Units\n\nThe token uses **6 decimals** (USDC/x402 convention): `$1 = 1_000_000` base units.\nHuman-readable `amount` params (e.g. `'100.5'`) are converted internally via\n`parseTokenAmount` — pass token units, not base units.\n\n## Installation\n\n```bash\nnpm install @bbuilders/djeon402-sdk-node\n# or\npnpm add @bbuilders/djeon402-sdk-node\n# or\nyarn add @bbuilders/djeon402-sdk-node\n```\n\n## Quick Start\n\n```typescript\nimport { Djeon402NodeSDK } from '@bbuilders/djeon402-sdk-node';\n\n// Configuration constants\nconst DJEON402_CONTRACT = '0x....';\nconst KYC_REGISTRY = '0x....';\nconst RPC_URL = 'http://localhost:8545'; // Anvil local node\nconst CHAIN_ID = 31337; // Foundry\n\n// Test account addresses\nconst TEST_ACCOUNT = '0x.....';\nconst RECIPIENT_ADDRESS = '0x....';\n\n// Initialize SDK\nconst sdk = new Djeon402NodeSDK({\n  rpcUrl: RPC_URL,\n  contractAddress: DJEON402_CONTRACT,\n  kycRegistryAddress: KYC_REGISTRY,\n  chainId: CHAIN_ID,\n});\n\n// Get token info\nconst info = await sdk.token.getInfo();\nconsole.log(`Token: ${info.name} (${info.symbol})`);\nconsole.log(`Total Supply: ${info.totalSupply}`);\n\n// Check balance\nconst balance = await sdk.token.getBalance(TEST_ACCOUNT);\nconsole.log(`Balance: ${balance.balance} DJEON`);\n\n// Transfer tokens\nconst result = await sdk.token.transfer({\n  privateKey: process.env.PRIVATE_KEY!,\n  to: RECIPIENT_ADDRESS,\n  amount: '100.5',\n});\nconsole.log(`Transfer successful! Hash: ${result.hash}`);\n```\n\n## Configuration\n\n### Constructor Options\n\n```typescript\ninterface SDKConfig {\n  rpcUrl: string;              // Blockchain RPC endpoint\n  contractAddress: Address;    // DJEON402 token contract address\n  kycRegistryAddress?: Address; // Optional KYC registry address\n  chainId: number;             // 31337 (Foundry) or 8453 (Base)\n}\n```\n\n### Supported Networks\n\n- **Foundry (Anvil)**: `chainId: 31337`\n- **Base**: `chainId: 8453`\n- **Other EVM chains**: any other `chainId` gets a minimal chain definition\n  built from `rpcUrl`, so transactions are signed with the correct chain id\n\n## API Reference\n\n### Token Module (`sdk.token`)\n\n#### `getInfo()`\nGet token information.\n\n```typescript\nconst info = await sdk.token.getInfo();\n// Returns: { name, symbol, decimals, totalSupply, paused, contractAddress }\n```\n\n#### `getBalance(address)`\nGet token balance for an address.\n\n```typescript\nconst balance = await sdk.token.getBalance('0x742d35...');\n// Returns: { address, balance, balanceRaw }\n```\n\n#### `getAllowance(owner, spender)`\nGet allowance amount.\n\n```typescript\nconst allowance = await sdk.token.getAllowance(\n  '0xOwner...',\n  '0xSpender...'\n);\n// Returns: { owner, spender, allowance, allowanceRaw }\n```\n\n#### `transfer({ privateKey, to, amount })`\nTransfer tokens.\n\n```typescript\nconst result = await sdk.token.transfer({\n  privateKey: '0xYourPrivateKey',\n  to: '0xRecipient...',\n  amount: '100.5', // Human-readable amount\n});\n// Returns: { success, hash, blockNumber }\n```\n\n#### `approve({ privateKey, spender, amount })`\nApprove spending allowance.\n\n```typescript\nconst result = await sdk.token.approve({\n  privateKey: '0xYourPrivateKey',\n  spender: '0xSpender...',\n  amount: '1000',\n});\n```\n\n#### `mint({ privateKey, to, amount })` (Admin only)\nMint new tokens.\n\n```typescript\nconst result = await sdk.token.mint({\n  privateKey: '0xAdminPrivateKey',\n  to: '0xRecipient...',\n  amount: '500',\n});\n```\n\n#### `burn({ privateKey, amount })` (Admin only)\nBurn tokens.\n\n```typescript\nconst result = await sdk.token.burn({\n  privateKey: '0xAdminPrivateKey',\n  amount: '100',\n});\n```\n\n### Admin Module (`sdk.admin`)\n\n#### `getRoles()`\nGet all role identifiers.\n\n```typescript\nconst roles = await sdk.admin.getRoles();\n// Returns: { DEFAULT_ADMIN_ROLE, MINTER_ROLE, BURNER_ROLE, PAUSER_ROLE, BLACKLISTER_ROLE }\n```\n\n#### `hasRole(role, account)`\nCheck if account has a role.\n\n```typescript\nconst result = await sdk.admin.hasRole(\n  '0xRoleHash...',\n  '0xAccount...'\n);\n// Returns: { role, address, hasRole }\n```\n\n#### `isBlacklisted(address)`\nCheck if address is blacklisted.\n\n```typescript\nconst result = await sdk.admin.isBlacklisted('0xAddress...');\n// Returns: { address, isBlacklisted }\n```\n\n#### `blacklist({ privateKey, account })`\nAdd address to blacklist.\n\n```typescript\nconst result = await sdk.admin.blacklist({\n  privateKey: '0xAdminPrivateKey',\n  account: '0xBadActor...',\n});\n```\n\n#### `unBlacklist({ privateKey, account })`\nRemove address from blacklist.\n\n```typescript\nconst result = await sdk.admin.unBlacklist({\n  privateKey: '0xAdminPrivateKey',\n  account: '0xAccount...',\n});\n```\n\n#### `pause(privateKey)` / `unpause(privateKey)`\nPause/unpause the contract.\n\n```typescript\nawait sdk.admin.pause('0xAdminPrivateKey');\nawait sdk.admin.unpause('0xAdminPrivateKey');\n```\n\n### KYC Module (`sdk.kyc`)\n\n#### `getData(address)`\nGet KYC data for a user.\n\n```typescript\nconst kyc = await sdk.kyc.getData('0xUser...');\n// Returns: { level, levelName, expiryDate, kycHash, isActive, dailyLimit, dailySpent, ... }\n```\n\n#### `verify({ adminPrivateKey, userAddress, level, expiryDate?, documents, kycHash? })`\nVerify user's KYC. When `kycHash` is omitted it is derived deterministically\n(keccak256) from `documents`; pass your own IPFS hash for real deployments.\n\n```typescript\nconst result = await sdk.kyc.verify({\n  adminPrivateKey: '0xAdminPrivateKey',\n  userAddress: '0xUser...',\n  level: 2, // 0: None, 1: Tier1, 2: Tier2, 3: Tier3, 4: Tier4\n  expiryDate: Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60, // 1 year\n  documents: [\n    { filename: 'passport.pdf', content: 'base64data...' },\n    { filename: 'proof.pdf', content: 'base64data...' },\n  ],\n  kycHash: 'QmYourIpfsHash...', // optional\n});\n```\n\n#### `updateKYC({ adminPrivateKey, userAddress, level, expiryDate? })` / `revokeKYC({ adminPrivateKey, userAddress })`\nUpdate or revoke an existing KYC record (admin only).\n\n#### `isKYCValid(address)`\nCheck whether a user's KYC is active, non-None, and not expired.\n\n```typescript\nconst valid = await sdk.kyc.isKYCValid('0xUser...'); // boolean\n```\n\n#### `checkDailyLimit({ adminPrivateKey, userAddress, amountUSD })`\nCheck whether an amount fits the user's daily limit **and record the spend**.\nThis contract function is state-mutating, so the SDK simulates first and\nreturns the real allow/deny boolean; the transaction is only sent when the\nspend is allowed. The caller must be the KYC admin or an approved provider.\nFor a read-only check use `getRemainingDailyLimit`.\n\n```typescript\nconst allowed = await sdk.kyc.checkDailyLimit({\n  adminPrivateKey: '0xAdminPrivateKey',\n  userAddress: '0xUser...',\n  amountUSD: '250',\n}); // boolean\n```\n\n#### `getRemainingDailyLimit(address)`\nRead-only remaining daily limit.\n\n```typescript\nconst remaining = await sdk.kyc.getRemainingDailyLimit('0xUser...');\n// Returns: bigint in base units (type(uint256).max when unlimited)\n```\n\n#### `setDailyLimit({ adminPrivateKey, userAddress, limitUSD })`\nSet a custom per-user daily limit (admin only).\n\n#### `setLevelLimit({ adminPrivateKey, level, limitUSD })`\nSet default daily limit for a KYC level (admin only).\n\n```typescript\n// Change Tier2 daily limit to $20,000\nconst result = await sdk.kyc.setLevelLimit({\n  adminPrivateKey: '0xAdminPrivateKey',\n  level: 2,\n  limitUSD: '20000',\n});\n```\n\n#### `getLevelLimit(level)`\nGet default daily limit for a KYC level.\n\n```typescript\nconst limit = await sdk.kyc.getLevelLimit(2); // Tier2\n// Returns: bigint (e.g. 10000000000n for $10,000 with 6 decimals)\n```\n\n### x402 Module (`sdk.x402`)\n\nEIP-3009 gasless transactions - allows users to authorize transfers without paying gas.\n\n#### `generateNonce()`\nGenerate a unique nonce for authorization.\n\n```typescript\nconst nonce = sdk.x402.generateNonce();\n// Returns: '0x........'\n```\n\n#### `getDomainSeparator()`\nGet EIP-712 domain separator. Signing methods read this from the contract, so\nsignatures stay valid for any deploy-time token name — never hardcode the\ndomain name.\n\n```typescript\nconst separator = await sdk.x402.getDomainSeparator();\n```\n\n#### `getAuthorizationState(authorizer, nonce)`\nCheck if a nonce has been used.\n\n```typescript\nconst isUsed = await sdk.x402.getAuthorizationState('0xAuthorizer...', '0xNonce...');\n// Returns: boolean\n```\n\n#### `signTransfer({ privateKey, from, to, amount, ... })`\nSign a transfer authorization (payer side).\n\n```typescript\nconst signature = await sdk.x402.signTransfer({\n  privateKey: '0xPayerPrivateKey',\n  from: '0xPayer...',\n  to: '0xRecipient...',\n  amount: '50',\n  validAfter: BigInt(Math.floor(Date.now() / 1000)),\n  validBefore: BigInt(Math.floor(Date.now() / 1000) + 3600),\n  nonce: sdk.x402.generateNonce(),\n});\n// Returns: { from, to, value, validAfter, validBefore, nonce, v, r, s }\n```\n\n#### `executeTransfer({ executorPrivateKey, authorization })`\nExecute a signed transfer authorization (executor/relayer side).\n\n```typescript\nconst result = await sdk.x402.executeTransfer({\n  executorPrivateKey: '0xExecutorPrivateKey',\n  authorization: signature,\n});\n// Returns: { success, hash, blockNumber }\n```\n\n#### `signReceive({ privateKey, from, to, amount, ... })`\nSign a receive authorization (payee side). The sender signs to authorize the receiver to pull funds.\n\n```typescript\nconst signature = await sdk.x402.signReceive({\n  privateKey: '0xSenderPrivateKey',\n  from: '0xSender...',\n  to: '0xReceiver...',\n  amount: '50',\n});\n// Returns: { from, to, value, validAfter, validBefore, nonce, v, r, s }\n```\n\n#### `executeReceive({ receiverPrivateKey, authorization })`\nExecute a signed receive authorization. The caller must be the receiver (`to` address).\n\n```typescript\nconst result = await sdk.x402.executeReceive({\n  receiverPrivateKey: '0xReceiverPrivateKey',\n  authorization: signature,\n});\n// Returns: { success, hash, blockNumber }\n```\n\n#### `cancelAuthorization({ privateKey, authorizer, nonce })`\nCancel an authorization by marking the nonce as used.\n\n```typescript\nconst result = await sdk.x402.cancelAuthorization({\n  privateKey: '0xAuthorizerPrivateKey',\n  authorizer: '0xAuthorizer...',\n  nonce: '0xNonce...',\n});\n// Returns: { success, hash, blockNumber }\n```\n\n#### Complete x402 Payment Flow\n\n```typescript\n// Step 1: User signs authorization (no gas needed)\nconst authorization = await sdk.x402.signTransfer({\n  privateKey: '0xUserPrivateKey',\n  from: '0xUser...',\n  to: '0xMerchant...',\n  amount: '99.99',\n});\n\n// Step 2: Relayer/backend executes the transfer (pays gas)\nconst result = await sdk.x402.executeTransfer({\n  executorPrivateKey: '0xRelayerPrivateKey',\n  authorization,\n});\n\nconsole.log(`Payment processed! Hash: ${result.hash}`);\n```\n\n#### Receive Flow (Payee-Initiated)\n\n```typescript\n// Step 1: Sender signs receive authorization\nconst authorization = await sdk.x402.signReceive({\n  privateKey: '0xSenderPrivateKey',\n  from: '0xSender...',\n  to: '0xReceiver...',\n  amount: '50',\n});\n\n// Step 2: Receiver executes (pulls funds)\nconst result = await sdk.x402.executeReceive({\n  receiverPrivateKey: '0xReceiverPrivateKey',\n  authorization,\n});\n```\n\n## Direct Blockchain Access\n\nAccess the underlying viem public client for custom operations:\n\n```typescript\n// Get current block number\nconst blockNumber = await sdk.publicClient.getBlockNumber();\n\n// Get ETH balance\nconst ethBalance = await sdk.publicClient.getBalance({\n  address: '0x......',\n});\n\n// Read custom contract method\nconst result = await sdk.publicClient.readContract({\n  address: sdk.contractAddress,\n  abi: [...],\n  functionName: 'customMethod',\n  args: [...],\n});\n```\n\n## Error Handling\n\nAll SDK methods may throw errors. Always wrap calls in try-catch blocks:\n\n```typescript\ntry {\n  const result = await sdk.token.transfer({\n    privateKey: '0x...',\n    to: '0x...',\n    amount: '100',\n  });\n  console.log('Success:', result.hash);\n} catch (error) {\n  if (error instanceof Error) {\n    console.error('Transfer failed:', error.message);\n  }\n}\n```\n\n## Examples\n\n### Backend API Integration\n\n```typescript\nimport { Djeon402NodeSDK } from '@bbuilders/djeon402-sdk-node';\nimport express from 'express';\n\n// Configuration from environment variables\nconst RPC_URL = process.env.RPC_URL!;\nconst CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS as `0x${string}`;\nconst CHAIN_ID = parseInt(process.env.CHAIN_ID || '31337');\nconst PRIVATE_KEY = process.env.PRIVATE_KEY as `0x${string}`;\n\nconst sdk = new Djeon402NodeSDK({\n  rpcUrl: RPC_URL,\n  contractAddress: CONTRACT_ADDRESS,\n  chainId: CHAIN_ID,\n});\n\nconst app = express();\n\napp.post('/api/transfer', async (req, res) => {\n  try {\n    const { to, amount } = req.body;\n    const result = await sdk.token.transfer({\n      privateKey: PRIVATE_KEY,\n      to,\n      amount,\n    });\n    res.json({ success: true, hash: result.hash });\n  } catch (error: any) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\napp.get('/api/balance/:address', async (req, res) => {\n  try {\n    const balance = await sdk.token.getBalance(req.params.address as `0x${string}`);\n    res.json(balance);\n  } catch (error: any) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\napp.listen(3000);\n```\n\n### Automated KYC Verification\n\n```typescript\nasync function verifyUserKYC(userAddress: string, documents: any[]) {\n  // Configuration constants\n  const RPC_URL = process.env.RPC_URL!;\n  const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS as `0x${string}`;\n  const CHAIN_ID = parseInt(process.env.CHAIN_ID || '31337');\n  const ADMIN_PRIVATE_KEY = process.env.ADMIN_KEY as `0x${string}`;\n\n  // KYC settings\n  const KYC_LEVEL = 2; // Tier2\n  const EXPIRY_DAYS = 365;\n  const EXPIRY_TIMESTAMP = Math.floor(Date.now() / 1000) + EXPIRY_DAYS * 24 * 60 * 60;\n\n  const sdk = new Djeon402NodeSDK({\n    rpcUrl: RPC_URL,\n    contractAddress: CONTRACT_ADDRESS,\n    chainId: CHAIN_ID,\n  });\n\n  // Verify user with Tier2 access\n  const result = await sdk.kyc.verify({\n    adminPrivateKey: ADMIN_PRIVATE_KEY,\n    userAddress: userAddress as `0x${string}`,\n    level: KYC_LEVEL,\n    expiryDate: EXPIRY_TIMESTAMP,\n    documents,\n  });\n\n  // Check KYC data\n  const kycData = await sdk.kyc.getData(userAddress as `0x${string}`);\n  console.log(`User verified: ${kycData.levelName}`);\n  console.log(`Daily limit: ${kycData.dailyLimit} USD`);\n\n  return result;\n}\n```\n\n### Gasless Payment Relayer\n\n```typescript\nimport { Djeon402NodeSDK } from '@bbuilders/djeon402-sdk-node';\n\n// Configuration constants\nconst RPC_URL = process.env.RPC_URL!;\nconst CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS as `0x${string}`;\nconst CHAIN_ID = parseInt(process.env.CHAIN_ID || '31337');\nconst RELAYER_PRIVATE_KEY = process.env.RELAYER_KEY as `0x${string}`;\n\nconst sdk = new Djeon402NodeSDK({\n  rpcUrl: RPC_URL,\n  contractAddress: CONTRACT_ADDRESS,\n  chainId: CHAIN_ID,\n});\n\n// User submits signed authorization to your API\napp.post('/api/relay-payment', async (req, res) => {\n  const { authorization } = req.body;\n\n  try {\n    // Your backend pays the gas\n    const result = await sdk.x402.executeTransfer({\n      executorPrivateKey: RELAYER_PRIVATE_KEY,\n      authorization,\n    });\n\n    res.json({\n      success: true,\n      hash: result.hash,\n      message: 'Payment processed without user paying gas',\n    });\n  } catch (error: any) {\n    res.status(500).json({ error: error.message });\n  }\n});\n```\n\n## TypeScript Support\n\nThis SDK is written in TypeScript and provides full type definitions:\n\n```typescript\nimport type {\n  TokenInfo,\n  BalanceResult,\n  TransferResult,\n  KYCData,\n  TransferAuthorizationSignature,\n  ReceiveAuthorizationSignature,\n  CancelAuthorizationParams,\n  CancelAuthorizationResult,\n} from '@bbuilders/djeon402-sdk-node';\n```\n\n## Security Notes\n\n- **Private Keys**: Never expose private keys in client-side code. This SDK is designed for server-side use only.\n- **Environment Variables**: Store private keys and sensitive data in environment variables.\n- **Input Validation**: The SDK validates addresses, amounts, and private keys, but you should still validate user input.\n- **Rate Limiting**: Implement rate limiting on your API endpoints to prevent abuse.\n\n## Related Packages\n\n- [@bbuilders/djeon402-contracts](https://www.npmjs.com/package/@bbuilders/djeon402-contracts) - Smart Contracts (Solidity / Foundry)\n- [@bbuilders/djeon402-core](https://www.npmjs.com/package/@bbuilders/djeon402-core) - Core types and utilities\n- [@bbuilders/djeon402-sdk-client](https://www.npmjs.com/package/@bbuilders/djeon402-sdk-client) - Browser/Frontend SDK\n\n## License\n\nMIT\n","readmeFilename":"README.md"}