{"_id":"@0xgasless/core","_rev":"5-d24b4ea6b5ac672ef159e51ef1e59599","name":"@0xgasless/core","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@0xgasless/core","version":"1.0.0","keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","_id":"@0xgasless/core@1.0.0","maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"homepage":"https://docs.0xgas.dev","bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"dist":{"shasum":"815cd934afaa9c123c1700f2934ef964559f51a7","tarball":"https://registry.npmjs.org/@0xgasless/core/-/core-1.0.0.tgz","fileCount":76,"integrity":"sha512-x00lEEmYuffOa867kbYiMkOWCMmH6N3KSKPBDfZil6Y/634HpmM3hHTbmKcoWtuD61bBU/4c4PGubMwEYQAbAw==","signatures":[{"sig":"MEUCIQC6LE+bV09LiNJQYDaRJN/1BOPTK5eamqZBFfBtL88YuAIgMNLc1Zx20vawBdyvRfxWgRN8qn1F+nkmheFab4SKqlc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256534},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"0xgasless","email":"0xgasless@gmail.com"},"repository":{"url":"git+https://github.com/0xgasless/0xgas-auth.git","type":"git"},"_npmVersion":"10.9.4","description":"Secure embedded wallet SDK for EVM chains — AWS KMS-backed signing via iframe widget","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","dependencies":{"viem":">=2.0.0","@0xgasless/smart-account":"file:../0xgasless-smart-sdk"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.0.0","typescript":"^5.0.0"},"peerDependencies":{"viem":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_1.0.0_1772784078062_0.11228667478142507","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@0xgasless/core","version":"1.0.1","keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","_id":"@0xgasless/core@1.0.1","maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"homepage":"https://docs.0xgas.dev","bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"dist":{"shasum":"f593156dcdf41ece4fadfa95742f4be99f91235a","tarball":"https://registry.npmjs.org/@0xgasless/core/-/core-1.0.1.tgz","fileCount":76,"integrity":"sha512-pabpY5xvsjPWthxCuIgl7uldg31INIMva/njfjj5crRWk7t2susbO7g60GURmNn/azuy9wM2iPlMfrqaf8BW9g==","signatures":[{"sig":"MEQCIFoXofZxLXAtquJJAYy7DHSsTxWI6FdwMkeeSK1DsXvnAiB2RA4W7gY+UAFLitQNXycCQzeZyfkwnEfbeXBOA7ibwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256518},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"e449335347254051d3c24aadb59712ee3560ed3c","scripts":{"build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"0xgasless","email":"0xgasless@gmail.com"},"repository":{"url":"git+https://github.com/0xgasless/0xgas-auth.git","type":"git"},"_npmVersion":"11.11.0","description":"Secure embedded wallet SDK for EVM chains — AWS KMS-backed signing via iframe widget","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","dependencies":{"viem":">=2.0.0","@0xgasless/smart-account-sdk":"0.0.12"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.0.0","typescript":"^5.0.0"},"peerDependencies":{"viem":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_1.0.1_1774036212801_0.8983132312590902","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@0xgasless/core","version":"1.0.2","keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","_id":"@0xgasless/core@1.0.2","maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"homepage":"https://docs.0xgas.dev","bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"dist":{"shasum":"ad426f8705b93b29ccd219004bdca56fb3a7bb9e","tarball":"https://registry.npmjs.org/@0xgasless/core/-/core-1.0.2.tgz","fileCount":76,"integrity":"sha512-Pz/9OK+NBhGo+W76ITmVk1PUrQW8Tm27i9Cmo8S0rVCh8AGAyau89Jd/YqSS7vlimTpciSnI+SpwlaCGp0821g==","signatures":[{"sig":"MEUCIBiquWureEpaBB0qQP/0bMnrgGP4RMOEriVl//ZfVDZUAiEA2gs+BvdSFAuGkpKDkOmFh8QWA5vYUTPNcwg9Rx1YPEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256591},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"bc8930917e40e8008ea961b16f94ffe16ebc2a64","scripts":{"build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"0xgasless","email":"0xgasless@gmail.com"},"repository":{"url":"git+https://github.com/0xgasless/0xgas-auth.git","type":"git"},"_npmVersion":"11.11.0","description":"Secure embedded wallet SDK for EVM chains — AWS KMS-backed signing via iframe widget","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","dependencies":{"viem":">=2.0.0","@0xgasless/smart-account-sdk":"^0.0.13"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.0.0","typescript":"^5.0.0"},"peerDependencies":{"viem":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_1.0.2_1774721933673_0.6726794596397543","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@0xgasless/core","version":"1.1.0","keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","_id":"@0xgasless/core@1.1.0","maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"homepage":"https://docs.0xgas.dev","bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"dist":{"shasum":"1e429bea8de7ca525264698b682521cddb37e474","tarball":"https://registry.npmjs.org/@0xgasless/core/-/core-1.1.0.tgz","fileCount":100,"integrity":"sha512-S7tozvUCmMbQxWbFHbov97Zh9Lc3Kah+34y+5nKEWvqjgtQKRc/WqVMEzvaSoC4SyvHFgHumopLulvyK/Kmzog==","signatures":[{"sig":"MEUCIHbMImVSPGHjezZv6ZwtcHObntH33VdtjVeBn24BdKzPAiEApXHEj0645llbEw/GVvT8enbs/g4uILk+6ZlhJdD98xU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":360426},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"ab85029c15847639337c9f45210ad3ee3cd9d5ee","scripts":{"build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"0xgasless","email":"0xgasless@gmail.com"},"repository":{"url":"git+https://github.com/0xgasless/0xgas-auth.git","type":"git"},"_npmVersion":"11.11.0","description":"All-in-one SDK for secure embedded wallets, ERC-4337 smart accounts, and server-side wallet management on EVM chains","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","dependencies":{"viem":">=2.0.0","@0xgasless/smart-account-sdk":"^0.0.13"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.0.0","typescript":"^5.0.0"},"peerDependencies":{"viem":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_1.1.0_1778786931457_0.42298620134849263","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@0xgasless/core","version":"1.1.1","description":"All-in-one SDK for secure embedded wallets, ERC-4337 smart accounts, and server-side wallet management on EVM chains","author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","homepage":"https://docs.0xgas.dev","repository":{"type":"git","url":"git+https://github.com/0xgasless/0xgas-auth.git"},"keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"type":"module","sideEffects":false,"main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"engines":{"node":">=16.0.0"},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig.esm.json","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build":"npm run clean && npm run build:esm && npm run build:cjs","prepublishOnly":"npm run build"},"dependencies":{"@0xgasless/smart-account-sdk":"^0.0.15","viem":">=2.0.0"},"peerDependencies":{"viem":">=2.0.0"},"devDependencies":{"typescript":"^5.0.0","viem":"^2.0.0"},"gitHead":"685e301b2987dc28ddbd295d1937a0bccf5c0577","_id":"@0xgasless/core@1.1.1","bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-FAy7F0QwIShb+aeoplfxcAkdx/5r83ZRYqvleK7HnlDTsqvv4+TYqgVto1o91inP/niUgQ4XayiPYt1lfiMAEA==","shasum":"b3c664dd55b10434e4b0a4c379ef0f0a751e12f0","tarball":"https://registry.npmjs.org/@0xgasless/core/-/core-1.1.1.tgz","fileCount":101,"unpackedSize":361967,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDs6aCvkoHit21VliK26hDEvwyXV2JK/WLZ0Q5Rs5Y1TgIhAI5Y+vYtrsritNP0QNnqkGoptQ3QHrdnZ4wgwv9ajUfQ"}]},"_npmUser":{"name":"0xgasless","email":"0xgasless@gmail.com"},"directories":{},"maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_1.1.1_1786168249354_0.09395208847920133"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T08:01:17.964Z","modified":"2026-08-08T05:50:49.647Z","1.0.0":"2026-03-06T08:01:18.273Z","1.0.1":"2026-03-20T19:50:12.952Z","1.0.2":"2026-03-28T18:18:53.870Z","1.1.0":"2026-05-14T19:28:51.625Z","1.1.1":"2026-08-08T05:50:49.492Z"},"bugs":{"url":"https://github.com/0xgasless/0xgas-auth/issues"},"author":{"name":"0xGas","email":"hello@0xgas.dev"},"license":"MIT","homepage":"https://docs.0xgas.dev","keywords":["ethereum","wallet","evm","kms","erc4337","smart-account","gasless","web3","signing","embedded-wallet"],"repository":{"type":"git","url":"git+https://github.com/0xgasless/0xgas-auth.git"},"description":"All-in-one SDK for secure embedded wallets, ERC-4337 smart accounts, and server-side wallet management on EVM chains","maintainers":[{"name":"0xgasless","email":"0xgasless@gmail.com"}],"readme":"# @0xgasless/core\n\n> The all-in-one SDK for secure embedded wallets, ERC-4337 smart accounts, and server-side wallet management on EVM chains.\n\n[![npm version](https://img.shields.io/npm/v/@0xgasless/core)](https://www.npmjs.com/package/@0xgasless/core)\n[![license](https://img.shields.io/npm/l/@0xgasless/core)](./LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue)](https://www.typescriptlang.org/)\n\n`@0xgasless/core` provides two powerful wallet primitives in a single package:\n\n| | **User Wallets** (`OxGasClient`) | **Server Wallets** (`OxGasServerWallet`) |\n|---|---|---|\n| **Environment** | Browser | Node.js / Server |\n| **Auth** | Email OTP, Google, MetaMask via widget | API key only — no login required |\n| **Signing** | User approves in secure iframe | Instant — no human approval |\n| **Use case** | dApps, web3 frontends | Telegram bots, trading bots, cron jobs |\n| **Key storage** | AWS KMS (iframe-secured) | AWS KMS (API-secured + policy engine) |\n\nPrivate keys **never leave AWS KMS** in either mode.\n\n---\n\n## Installation\n\n```bash\nnpm install @0xgasless/core\n# or\nyarn add @0xgasless/core\n# or\npnpm add @0xgasless/core\n```\n\n---\n\n# User Wallets (Browser)\n\nUse `OxGasClient` for browser-based dApps where end users authenticate and approve transactions.\n\n## Quick Start\n\n```typescript\nimport { OxGasClient } from '@0xgasless/core';\n\nconst client = new OxGasClient({\n  apiKey: 'your-api-key',\n  chainId: 11155111,\n  bundlerUrl: 'https://bundler.0xgasless.com/11155111',\n  paymasterUrl: 'https://paymaster.0xgasless.com/v1/11155111/rpc/your-paymaster-key',\n  debug: true,\n});\n\n// 1. Authenticate — opens the secure widget\nconst wallet = await client.login();\nconsole.log('Logged in as:', wallet.email);\n\n// 2. Initialize Smart Account\nconst smartAccountAddress = await client.setupSmartAccount();\nconsole.log('Smart Account:', smartAccountAddress);\n\n// 3. Send a Gasless Transaction\nconst { wait } = await client.sendTransaction({\n  to: '0xTargetContract...',\n  value: 0n,\n  data: '0x...',\n});\nconst receipt = await wait();\nconsole.log('Confirmed:', receipt.receipt.transactionHash);\n```\n\n## OxGasClient Configuration\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `apiKey` | `string` | **(required)** | Your 0xGas API key |\n| `chainId` | `number` | `1` | Target EVM chain ID |\n| `bundlerUrl` | `string` | **(required)** | ERC-4337 bundler RPC URL |\n| `paymasterUrl` | `string` | **(required)** | Paymaster RPC URL for gas sponsorship |\n| `rpcUrl` | `string` | — | Optional custom RPC URL |\n| `accountIndex` | `number` | `0` | Derive multiple smart accounts per user |\n| `debug` | `boolean` | `false` | Enable verbose console logging |\n\n## OxGasClient API\n\n### `client.login()`\nOpens the widget for email/password authentication. Returns `WalletInfo` with the KMS EOA address and email. Resolves immediately if already logged in.\n\n### `client.setupSmartAccount()`\nDerives the ERC-4337 smart account. Must be called after `login()`. Returns the deterministic smart account address.\n\n### `client.sendTransaction(tx)`\nSigns via KMS widget, sponsors gas via paymaster, submits to bundler. Returns `UserOpResponse` with `wait()` for confirmation.\n\n### `client.sendBatchTransactions(txs)`\nExecute multiple calls in a single UserOperation:\n\n```typescript\nawait client.sendBatchTransactions([\n  { to: '0xToken...', data: '0xApprove...' },\n  { to: '0xProtocol...', data: '0xDeposit...' },\n]);\n```\n\n### `client.transferToken(params)`\nGasless ERC-20 transfer with automatic decimal handling:\n\n```typescript\nawait client.transferToken({\n  tokenAddress: '0xUSDC...',\n  to: '0xRecipient...',\n  amount: '10.5', // Human-readable, parsed automatically\n});\n```\n\n### `client.getTokenBalance(tokenAddress)`\nReturns `{ balance, symbol, name, decimals, rawBalance }` for the smart account.\n\n### Properties & Lifecycle\n\n```typescript\nclient.isLoggedIn            // boolean\nclient.eoaAddress            // KMS signer address\nclient.smartAccountAddress   // Smart account address\nclient.chainId               // Active chain ID\nclient.rpcUrl                // Active RPC URL\n\nawait client.logout();       // Clear session & iframe\n```\n\n---\n\n# Server Wallets (Node.js)\n\nUse `OxGasServerWallet` for backend systems — Telegram bots, trading bots, cron jobs, AI agents — where wallets need to be managed programmatically without any user interaction.\n\n## Quick Start\n\n```typescript\nimport { OxGasServerWallet } from '@0xgasless/core';\n\nconst wallet = new OxGasServerWallet({\n  apiKey: 'your_project_api_key',\n  defaultChainId: 43113, // Avalanche Fuji\n});\n\n// Create or retrieve a wallet — safe to call every time\nconst address = await wallet.getAddress('telegram_123456789');\nconsole.log('Wallet:', address);\n\n// Sign a transaction\nconst result = await wallet.signTransaction('telegram_123456789', {\n  to: '0x1111111111111111111111111111111111111111',\n  value: '1000000000000000', // wei as string\n  nonce: 0,\n  chainId: 43113,\n});\n\n// Broadcast to the network\nconst { txHash } = await wallet.broadcastTransaction(\n  result.rawTx,\n  'https://api.avax-test.network/ext/bc/C/rpc'\n);\nconsole.log('Transaction:', txHash);\n```\n\n## OxGasServerWallet Configuration\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `apiKey` | `string` | **(required)** | Your 0xGas project API key |\n| `baseUrl` | `string` | `https://pmwv2d8iwa...` | Override the API base URL |\n| `defaultChainId` | `number` | `1` | Default chain ID when not specified per call |\n| `timeout` | `number` | `30000` (30s) | HTTP request timeout in ms |\n\n## OxGasServerWallet API\n\n### `wallet.getOrCreateWallet(userId, options?)`\n\nCreates a new wallet or returns the existing one. **Idempotent** — safe to call on every user interaction.\n\n```typescript\nconst info = await wallet.getOrCreateWallet('telegram_123456789', {\n  label: \"John's trading wallet\", // Optional, shown in dashboard\n  chainId: 43113,                 // Optional, overrides defaultChainId\n});\n// info.address, info.userId, info.existing, info.projectId, ...\n```\n\n### `wallet.getAddress(userId, options?)`\n\nConvenience method — calls `getOrCreateWallet` and returns just the address string.\n\n```typescript\nconst address = await wallet.getAddress('telegram_123456789');\n```\n\n### `wallet.signTransaction(userId, txParams)`\n\nSigns a transaction instantly via KMS — no human approval required.\n\n```typescript\nconst result = await wallet.signTransaction('telegram_123456789', {\n  to: '0x1111111111111111111111111111111111111111',\n  value: '1000000000000000',   // wei as string\n  nonce: 0,\n  chainId: 43113,\n  gas: 21000,                  // optional, default 21000\n  gasPrice: '30000000000',     // optional, default 30 gwei\n  data: '0x',                  // optional, for contract calls\n});\n// result.rawTx — signed, RLP-encoded, ready to broadcast\n// result.txHash — pre-computed hash\n// result.from — the server wallet address\n```\n\n### `wallet.broadcastTransaction(rawTx, rpcUrl)`\n\nBroadcasts a signed transaction to any EVM-compatible RPC endpoint.\n\n```typescript\nconst { txHash } = await wallet.broadcastTransaction(\n  result.rawTx,\n  'https://api.avax-test.network/ext/bc/C/rpc'\n);\n```\n\n### `wallet.listWallets()`\n\nList all server wallets in the project.\n\n```typescript\nconst { wallets, totalWallets } = await wallet.listWallets();\n```\n\n## Telegram Bot Example\n\nA complete example integrating `OxGasServerWallet` with a Telegram bot:\n\n```typescript\nimport { OxGasServerWallet, PolicyViolationError } from '@0xgasless/core';\n\nconst wallet = new OxGasServerWallet({\n  apiKey: 'your_project_api_key',\n  defaultChainId: 43113,\n});\n\n// Handle /wallet command\nbot.command('wallet', async (ctx) => {\n  const userId = `telegram_${ctx.from.id}`;\n  const address = await wallet.getAddress(userId);\n  await ctx.reply(`Your wallet address:\\n\\`${address}\\``, { parse_mode: 'Markdown' });\n});\n\n// Handle /send command\nbot.command('send', async (ctx) => {\n  const userId = `telegram_${ctx.from.id}`;\n  const [toAddress, amountWei] = ctx.message.text.split(' ').slice(1);\n\n  try {\n    const result = await wallet.signTransaction(userId, {\n      to: toAddress as `0x${string}`,\n      value: amountWei,\n      nonce: 0, // Fetch from chain in production\n      chainId: 43113,\n    });\n\n    const { txHash } = await wallet.broadcastTransaction(\n      result.rawTx,\n      'https://api.avax-test.network/ext/bc/C/rpc'\n    );\n\n    await ctx.reply(`✅ Transaction sent!\\nHash: ${txHash}`);\n  } catch (err) {\n    if (err instanceof PolicyViolationError) {\n      await ctx.reply(`❌ Blocked by policy: ${err.reason}`);\n    } else {\n      await ctx.reply(`❌ Transaction failed: ${(err as Error).message}`);\n    }\n  }\n});\n```\n\n---\n\n## Error Handling\n\nAll errors extend `OxGasError` and include a programmatic `code` field:\n\n```typescript\nimport {\n  // User wallet errors\n  NotConnectedError,     // code: 'NOT_CONNECTED'\n  SigningRejectedError,  // code: 'SIGNING_REJECTED'\n  SigningTimeoutError,   // code: 'TIMEOUT'\n  WidgetError,           // code: 'WIDGET_ERROR'\n\n  // Server wallet errors\n  WalletNotFoundError,   // code: 'WALLET_NOT_FOUND'\n  PolicyViolationError,  // code: 'POLICY_VIOLATION'  — includes .reason\n  ServerSigningError,    // code: 'SERVER_SIGNING_ERROR'\n  NetworkError,          // code: 'NETWORK_ERROR'     — includes .statusCode\n} from '@0xgasless/core';\n```\n\n---\n\n## Security & Architecture\n\n1. **AWS KMS**: All private keys live inside HSM hardware. Keys never leave KMS in either user wallet or server wallet mode.\n2. **Iframe Widget** (user wallets): Authentication and signing happen inside a sandboxed cross-origin iframe. The parent app never sees tokens or keys.\n3. **Policy Engine** (server wallets): Transactions are validated against spending limits, allowed chains, and blocked addresses configured in the 0xgas dashboard before KMS signs.\n4. **Signer Adapter**: Bridges the KMS-backed iframe with the ERC-4337 smart account infrastructure via an EIP-191 compatible interface.\n\n## License\n\n[MIT](./LICENSE)\n\n","readmeFilename":"README.md"}