{"_id":"nanopay","_rev":"29-236cc5cac14307b9a11a3ab1d3419468","name":"nanopay","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"nanopay","version":"0.0.1","keywords":["nano","cryptocurrency","toolkit"],"author":{"name":"chiragasarpota"},"license":"GPL-3.0-only","_id":"nanopay@0.0.1","maintainers":[{"name":"chiragasarpota","email":"hi@chiragasarpota.com"}],"homepage":"https://github.com/chiragasarpota/nanopay#readme","bugs":{"url":"https://github.com/chiragasarpota/nanopay/issues"},"dist":{"shasum":"f655c543cd04649ba9b4d633b8eb7f445a7a00da","tarball":"https://registry.npmjs.org/nanopay/-/nanopay-0.0.1.tgz","fileCount":5,"integrity":"sha512-3i5zUA6fF4nU2H/3vBBZyo6FVOdOsGc3D16e6kz58Nt+993jC8uzPvSEhx7tlv/M/t8gOhIy2m2KHtfe1KReng==","signatures":[{"sig":"MEYCIQD/mMR5pZzuprGUl0CvN1+mbYZyG9WPwvd9XPXLC9xkRwIhAOFYa+zhaO7JN9gf8p2suv9pM+TMEVcrjPcRuy3PrY/w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36809},"main":"./index.js","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"},"./package.json":"./package.json"},"_npmUser":{"name":"chiragasarpota","email":"hi@chiragasarpota.com"},"repository":{"url":"git+https://github.com/chiragasarpota/nanopay.git","type":"git"},"_npmVersion":"10.9.2","description":"Nano cryptocurrency toolkit. Initial package setup; toolkit implementation follows in the next release.","directories":{},"_nodeVersion":"22.16.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/nanopay_0.0.1_1789087259997_0.1115197591754975","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"nanopay","version":"0.1.0","keywords":["nano","cryptocurrency","toolkit"],"author":{"name":"chiragasarpota"},"license":"GPL-3.0-only","_id":"nanopay@0.1.0","maintainers":[{"name":"chiragasarpota","email":"hi@chiragasarpota.com"}],"contributors":[{"url":"https://github.com/marvinroger","name":"Marvin ROGER"}],"homepage":"https://github.com/chiragasarpota/nanopay#readme","bugs":{"url":"https://github.com/chiragasarpota/nanopay/issues"},"bin":{"nanopay":"dist/cli.js"},"dist":{"shasum":"1a96abf594c95347a727c98ab9769c8edb324f96","tarball":"https://registry.npmjs.org/nanopay/-/nanopay-0.1.0.tgz","fileCount":230,"integrity":"sha512-1/JxlkVHyWXf+civ9PT5qSbeEZLkFTE9JlK/hwTvgp2ohGpiQpIlmur5B8GHV9UEc3wtKiHmYLl3Q9IdmWIxhw==","signatures":[{"sig":"MEUCIQCCh0yyiTyUFH22eXS5doimOK+E60kWMJsWPpVYqizegQIgSdu+wAncEQk0ypwczv7m+8QSEh9oC62pnnvjB8Gh56Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3934535},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/types-cjs/index.d.ts","default":"./dist/index.cjs"}},"./rpc":{"import":{"types":"./dist/types/rpc-api.d.ts","default":"./dist/rpc.js"},"require":{"types":"./dist/types-cjs/rpc-api.d.ts","default":"./dist/rpc.cjs"}},"./keys":{"import":{"types":"./dist/types/key-api.d.ts","default":"./dist/keys.js"},"require":{"types":"./dist/types-cjs/key-api.d.ts","default":"./dist/keys.cjs"}},"./work":{"import":{"types":"./dist/types/work-api.d.ts","default":"./dist/work.js"},"require":{"types":"./dist/types-cjs/work-api.d.ts","default":"./dist/work.cjs"}},"./blocks":{"import":{"types":"./dist/types/block-api.d.ts","default":"./dist/blocks.js"},"require":{"types":"./dist/types-cjs/block-api.d.ts","default":"./dist/blocks.cjs"}},"./legacy":{"import":{"types":"./dist/types/legacy.d.ts","default":"./dist/legacy.js"},"require":{"types":"./dist/types-cjs/legacy.d.ts","default":"./dist/legacy.cjs"}},"./amounts":{"import":{"types":"./dist/types/amount-api.d.ts","default":"./dist/amounts.js"},"require":{"types":"./dist/types-cjs/amount-api.d.ts","default":"./dist/amounts.cjs"}},"./browser":"./dist/nanopay.js","./mnemonic":{"import":{"types":"./dist/types/mnemonic.d.ts","default":"./dist/mnemonic.js"},"require":{"types":"./dist/types-cjs/mnemonic.d.ts","default":"./dist/mnemonic.cjs"}},"./payments":{"import":{"types":"./dist/types/payment-uri.d.ts","default":"./dist/payments.js"},"require":{"types":"./dist/types-cjs/payment-uri.d.ts","default":"./dist/payments.cjs"}},"./package.json":"./package.json","./confirmations":{"import":{"types":"./dist/types/confirmations.d.ts","default":"./dist/confirmations.js"},"require":{"types":"./dist/types-cjs/confirmations.d.ts","default":"./dist/confirmations.cjs"}}},"gitHead":"85d3a5f71458ccc99346fbb20afec27fd506a080","scripts":{"test":"npm run build && node --test test/*.test.js test/upstream/*.test.js","bench":"npm run build && node scripts/benchmark.mjs","build":"node scripts/build.mjs","check":"npm run typecheck && npm test && npm run test:browser && npm run format:check && npm run test:package","format":"prettier --write .","prepack":"npm run build","typecheck":"tsc --noEmit","build:wasm":"node scripts/build-wasm.mjs","format:check":"prettier --check .","test:browser":"node --test test/browser/*.test.js","test:package":"node scripts/check-package.mjs","prepublishOnly":"npm run check","test:integration":"npm run build && node scripts/test-integration.mjs","release:bootstrap":"node scripts/publish-bootstrap.mjs"},"_npmUser":{"name":"chiragasarpota","email":"hi@chiragasarpota.com"},"repository":{"url":"git+https://github.com/chiragasarpota/nanopay.git","type":"git"},"_npmVersion":"10.9.2","description":"Nano toolkit with granular cryptography, mnemonic wallets, block building, proof of work, RPC and payment workflows.","directories":{},"sideEffects":["./dist/nanopay.js"],"_nodeVersion":"22.16.0","dependencies":{"blakejs":"^1.2.1","@scure/bip39":"^2.4.0","@noble/hashes":"^2.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"expect":"^30.5.1","esbuild":"^0.28.2","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^22.20.2","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/nanopay_0.1.0_1789087672710_0.4591798834321448","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"nanopay","version":"0.2.0","description":"Nano toolkit with granular cryptography, mnemonic wallets, block building, proof of work, RPC and payment workflows.","main":"./dist/index.cjs","types":"./dist/types/index.d.ts","exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/types-cjs/index.d.ts","default":"./dist/index.cjs"}},"./browser":"./dist/nanopay.js","./package.json":"./package.json","./legacy":{"import":{"types":"./dist/types/legacy.d.ts","default":"./dist/legacy.js"},"require":{"types":"./dist/types-cjs/legacy.d.ts","default":"./dist/legacy.cjs"}},"./keys":{"import":{"types":"./dist/types/key-api.d.ts","default":"./dist/keys.js"},"require":{"types":"./dist/types-cjs/key-api.d.ts","default":"./dist/keys.cjs"}},"./blocks":{"import":{"types":"./dist/types/block-api.d.ts","default":"./dist/blocks.js"},"require":{"types":"./dist/types-cjs/block-api.d.ts","default":"./dist/blocks.cjs"}},"./work":{"import":{"types":"./dist/types/work-api.d.ts","default":"./dist/work.js"},"require":{"types":"./dist/types-cjs/work-api.d.ts","default":"./dist/work.cjs"}},"./rpc":{"import":{"types":"./dist/types/rpc-api.d.ts","default":"./dist/rpc.js"},"require":{"types":"./dist/types-cjs/rpc-api.d.ts","default":"./dist/rpc.cjs"}},"./amounts":{"import":{"types":"./dist/types/amount-api.d.ts","default":"./dist/amounts.js"},"require":{"types":"./dist/types-cjs/amount-api.d.ts","default":"./dist/amounts.cjs"}},"./mnemonic":{"import":{"types":"./dist/types/mnemonic.d.ts","default":"./dist/mnemonic.js"},"require":{"types":"./dist/types-cjs/mnemonic.d.ts","default":"./dist/mnemonic.cjs"}},"./payments":{"import":{"types":"./dist/types/payment-uri.d.ts","default":"./dist/payments.js"},"require":{"types":"./dist/types-cjs/payment-uri.d.ts","default":"./dist/payments.cjs"}},"./confirmations":{"import":{"types":"./dist/types/confirmations.d.ts","default":"./dist/confirmations.js"},"require":{"types":"./dist/types-cjs/confirmations.d.ts","default":"./dist/confirmations.cjs"}}},"engines":{"node":">=22"},"author":{"name":"chiragasarpota"},"license":"GPL-3.0-only","repository":{"type":"git","url":"git+https://github.com/chiragasarpota/nanopay.git"},"bugs":{"url":"https://github.com/chiragasarpota/nanopay/issues"},"homepage":"https://docs.nanopay.me","keywords":["nano","cryptocurrency","toolkit"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"type":"module","module":"./dist/index.js","bin":{"nanopay":"dist/cli.js"},"sideEffects":["./dist/nanopay.js"],"scripts":{"build":"node scripts/build.mjs","typecheck":"tsc --noEmit","test":"npm run build && node --test test/*.test.js test/upstream/*.test.js","test:browser":"node --test test/browser/*.test.js","test:package":"node scripts/check-package.mjs","test:integration":"npm run build && node scripts/test-integration.mjs","format":"prettier --write .","format:check":"prettier --check .","check":"npm run typecheck && npm test && npm run test:browser && npm run format:check && npm run test:package","prepack":"npm run build","prepublishOnly":"npm run check","build:wasm":"node scripts/build-wasm.mjs","bench":"npm run build && node scripts/benchmark.mjs","release:bootstrap":"node scripts/publish-bootstrap.mjs","docs:dev":"npm --prefix site run dev --","docs:build":"npm --prefix site run build --","docs:preview":"npm --prefix site run preview --","docs:deploy":"npm --prefix site run deploy","docs:check":"npm run build && node scripts/check-doc-examples.mjs && node --test scripts/docs-server.test.mjs && npm run docs:build && node scripts/check-docs.mjs"},"dependencies":{"@noble/hashes":"^2.4.0","@scure/bip39":"^2.4.0","blakejs":"^1.2.1"},"devDependencies":{"@playwright/test":"^1.63.0","@types/node":"^22.20.2","esbuild":"^0.28.2","expect":"^30.5.1","prettier":"^3.9.6","typescript":"^7.0.2"},"contributors":[{"name":"Marvin ROGER","url":"https://github.com/marvinroger"}],"_id":"nanopay@0.2.0","gitHead":"74b44f814448ecaf21e274b67786754c13a11a71","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-+L/O7Oqtzvv5aTa/OYhhReKkua5I9y5c2yxJsD170OjdQfwcyY/ZTL22JDaaj8lgsUBgkFDzU31/U2ZXVLK2Lg==","shasum":"e6d1b58dfc9382b6c899813d332d9af334dc7020","tarball":"https://registry.npmjs.org/nanopay/-/nanopay-0.2.0.tgz","fileCount":249,"unpackedSize":4006539,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFUpGFeZL1ft0cAtPzmGP6fphe443mPBZ0ndQgsM4SJ6AiEA2cjcpXZYHcr5zLg6JSqlBrKdAUwBTKYlUpAZr8OKxHA="}]},"_npmUser":{"name":"chiragasarpota","email":"hi@chiragasarpota.com"},"directories":{},"maintainers":[{"name":"chiragasarpota","email":"hi@chiragasarpota.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nanopay_0.2.0_1789160339423_0.49647030979001006"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-11T00:40:59.848Z","modified":"2026-09-11T20:58:59.719Z","1.0.0":"2021-01-09T14:52:30.536Z","1.0.1":"2021-01-09T15:05:50.855Z","1.0.2":"2021-01-09T15:49:57.425Z","1.0.4":"2021-01-10T04:47:45.044Z","1.0.5":"2021-01-10T05:35:23.620Z","1.0.6":"2021-01-10T12:48:11.043Z","1.0.7":"2021-01-10T12:58:39.021Z","1.0.9":"2021-01-10T14:41:35.779Z","1.1.0":"2021-01-10T14:59:19.280Z","1.1.4":"2021-01-25T20:06:42.087Z","1.1.5":"2021-01-26T02:54:21.806Z","2.0.0":"2021-01-26T02:55:07.927Z","2.0.1":"2021-02-11T23:27:21.911Z","2.1.1":"2021-02-11T23:33:34.297Z","3.0.0":"2021-10-26T21:37:12.294Z","3.0.1":"2021-10-26T21:45:23.564Z","3.0.3":"2021-10-28T11:58:49.945Z","3.0.5":"2021-10-28T12:03:55.879Z","4.0.0":"2022-11-17T21:52:06.086Z","4.0.1":"2022-11-17T22:07:11.539Z","4.0.2":"2022-11-17T22:20:23.006Z","4.0.4":"2022-11-17T22:35:38.838Z","4.0.5":"2023-04-16T09:31:12.515Z","0.0.1":"2026-09-11T00:41:00.139Z","0.1.0":"2026-09-11T00:47:52.900Z","0.2.0":"2026-09-11T20:58:59.583Z"},"bugs":{"url":"https://github.com/chiragasarpota/nanopay/issues"},"author":{"name":"chiragasarpota"},"license":"GPL-3.0-only","homepage":"https://docs.nanopay.me","keywords":["nano","cryptocurrency","toolkit"],"repository":{"type":"git","url":"git+https://github.com/chiragasarpota/nanopay.git"},"description":"Nano toolkit with granular cryptography, mnemonic wallets, block building, proof of work, RPC and payment workflows.","contributors":[{"name":"Marvin ROGER","url":"https://github.com/marvinroger"}],"maintainers":[{"name":"chiragasarpota","email":"hi@chiragasarpota.com"}],"readme":"# nanopay\n\nNano for JavaScript and TypeScript: create or recover accounts, send and receive funds, build blocks, sign locally, generate work, and query a node.\n\nUse the client for complete workflows. Use the exported functions when you want control over each step. Both use the same Nano cryptography and block builders.\n\n[Complete API reference](docs/api.md) · [Runtime support](docs/runtimes.md) · [Performance](docs/performance.md) · [Release status](docs/releasing.md)\n\nVersion `0.2.0` uses BerryPay's public Nano mainnet RPC when you call `createClient()` or `createRpcClient()` without a URL. `0.1.0` requires an explicit URL. See the [documentation](https://docs.nanopay.me), [node configuration](docs/guides/node-configuration.md) and [deployment guide](docs/deployment.md).\n\n## Install\n\n```sh\nnpm install nanopay\n```\n\nTo develop from source, use `npm ci && npm run build` and import from `./dist/index.js`. Node.js 22+, ESM, CommonJS, TypeScript and modern browsers are supported. A browser script bundle exposes `NanoPay`.\n\n## Create or recover accounts\n\n```js\nimport {\n  createWallet,\n  walletFromSeed,\n  accountFromPrivateKey,\n  walletFromMnemonic,\n} from 'nanopay'\n\nconst wallet = createWallet()\nconst first = wallet.account() // index 0\nconst second = wallet.account(1)\n\n// Each account has { privateKey, publicKey, address }.\nconsole.log(first.address)\n\nconst recovered = walletFromSeed(savedSeed).account(1)\nconst imported = accountFromPrivateKey(savedPrivateKey)\nconst mnemonicWallet = await walletFromMnemonic(savedWords, {\n  passphrase: savedPassphrase,\n})\nconst mnemonicAccount = mnemonicWallet.account()\n```\n\nBack up `wallet.seed`, or your mnemonic **and its passphrase**, according to how the wallet was created. A private key controls one account; it cannot recover the wallet's seed or other accounts. Keep seeds and private keys out of logs and RPC requests.\n\nNative Nano hex seeds and BIP39 mnemonic seeds follow different derivation schemes. `walletFromSeed` uses Nano's BLAKE2b derivation. `walletFromMnemonic` follows BIP39 and the Nano SLIP-0010 path `m/44'/165'/index'`. It matches the [official Nano key-management vectors](https://docs.nano.org/integration-guides/key-management/).\n\n## Send, receive, and confirm\n\n```js\nimport { createClient, walletFromSeed } from 'nanopay'\n\nconst client = createClient({ rpcUrl: 'http://127.0.0.1:7076' })\nconst account = walletFromSeed(savedSeed).account()\n\nconst balance = await client.getBalance(account.address)\nconsole.log(balance.balance) // confirmed Nano, exact decimal string\n\nconst sent = await client.send({\n  account,\n  to: recipientAddress,\n  amount: '0.125', // Nano; alternatively use amountRaw: '1'\n})\nawait client.waitForConfirmation(sent.hash)\n\nconst received = await client.receiveAll({\n  account,\n  representative: chosenRepresentative,\n  maxBlocks: 100,\n})\nfor (const transaction of received.transactions) {\n  await client.waitForConfirmation(transaction.hash)\n}\n\nawait client.changeRepresentative({\n  account,\n  representative: chosenRepresentative,\n})\n```\n\nThe client reads account state, builds a block, signs locally, requests work, verifies it, and submits once. Choose a representative for the first receive; existing accounts keep theirs unless you supply another. `receive({ account, hash })` receives one confirmed incoming send. `receiveAll` processes a bounded snapshot and reports `hasMore` when that snapshot contains additional blocks.\n\nIn `0.2.0`, use `createClient()` for BerryPay or pass `rpcUrl` as above to use your own node. BerryPay receives the RPC queries and signed blocks you send to it; local account creation and signing do not make network requests. The public service can apply rate limits and action restrictions.\n\nWrites to the same account queue inside a client instance. Different accounts and independent reads run concurrently. Coordinate writers yourself when using multiple clients, processes, devices, or the granular prepare/publish methods.\n\n`status: 'submitted'` means the node accepted the block. Use `waitForConfirmation` before treating it as settled. If submission fails, `TransactionError.transaction` retains the exact hash and signed block; inspect that hash before trying again. `ReceiveAllError.completed` preserves earlier successful submissions, and its `cause` identifies the failed step. Writes are never retried automatically.\n\nA submission failure blocks further writes to that account with `AccountBlockedError`, including already queued writes. After reconciling the failed transaction with the node, call `client.resumeAccount(address, transactionHash)` to allow new writes; rejected writes are never replayed. A missing hash alone does not prove the node stopped processing it.\n\n## Full control, one step at a time\n\n```js\nimport {\n  generateSeed,\n  derivePrivateKey,\n  derivePublicKey,\n  deriveAddress,\n  buildSendBlock,\n  hashBlock,\n  signHash,\n  attachSignature,\n  getWorkRoot,\n  attachWork,\n  createRpcClient,\n} from 'nanopay'\n\nconst seed = generateSeed()\nconst privateKey = derivePrivateKey(seed, 0)\nconst publicKey = derivePublicKey(privateKey)\nconst address = deriveAddress(publicKey)\n\n// Use a funded account's state here; a fresh account cannot send yet.\nconst rpc = createRpcClient('http://127.0.0.1:7076')\nconst state = await rpc.getAccountInfo(address)\nif (!state) throw new Error('Receive funds into this account first')\n\nconst unsigned = buildSendBlock({\n  account: address,\n  previous: state.frontier,\n  representative: state.representative,\n  balanceRaw: state.balanceRaw,\n  to: recipientAddress,\n  amountRaw: '1',\n})\nconst hash = hashBlock(unsigned)\nconst signature = signHash(hash, privateKey)\nconst signed = attachSignature(unsigned, signature)\nconst work = await rpc.generateWork(getWorkRoot(signed))\nconst block = attachWork(signed, work)\nawait rpc.publishBlock(block, 'send')\n```\n\n`build*` functions need no private keys. `signBlock(unsigned, privateKey)` combines hashing and signing. `createSendBlock`, `createReceiveBlock` and `createChangeBlock` combine building and signing, returning `{ hash, block }`. None of those functions contacts a node. `client.prepareSend`, `prepareReceive` and `prepareChangeRepresentative` add ledger reads and return unsigned transactions for your own signing flow.\n\nExternal signers implement `{ publicKey, sign(hash) }`; pass that object as `account`. Signatures must use **Nano's Ed25519-BLAKE2b**, not standard Ed25519-SHA512. Work providers implement `work({ root, threshold, signal })`. You can use local WASM, a GPU service, or a separate work node. See [signer and work examples](docs/api.md#custom-signing-and-work).\n\n## Exact amounts\n\n```js\nimport { nanoToRaw, rawToNano } from 'nanopay/amounts'\n\nnanoToRaw('1.25') // '1250000000000000000000000000000'\nrawToNano('1') // '0.000000000000000000000000000001'\n```\n\nAmounts use strings, never floating-point numbers. `amount` means Nano; `amountRaw` and `balanceRaw` mean raw. One Nano is `10^30` raw. Fractional raw and uint128 overflow are rejected. General `convert` and `Unit` remain available; the historical `Unit.nano` means `10^24` raw, so use `nanoToRaw` for ordinary Nano amounts.\n\n## Payment links and live confirmations\n\n```js\nimport { createPaymentUri, parsePaymentUri, watchConfirmations } from 'nanopay'\n\nconst uri = createPaymentUri({\n  address: account.address,\n  amount: '1.25',\n  label: 'Coffee',\n})\nconst request = parsePaymentUri(uri)\n\nfor await (const event of watchConfirmations('ws://127.0.0.1:7078', {\n  accounts: [account.address],\n  signal: controller.signal,\n})) {\n  console.log(event.hash, event.amount)\n}\n```\n\nPayment URIs encode raw as required by Nano. WebSocket notifications can repeat; deduplicate by hash. A disconnect, malformed message, or full buffer raises an error. Reconcile history and receivables through RPC after reconnecting. This stream has no automatic reconnect or persistent payment accounting.\n\n## Small imports and local work\n\nFocused entry points avoid loading unrelated modules:\n\n```js\nimport { derivePrivateKey, deriveAddress } from 'nanopay/keys'\nimport { buildReceiveBlock, signBlock } from 'nanopay/blocks'\nimport { generateWork, RECEIVE_WORK_THRESHOLD } from 'nanopay/work'\n\nconst work = await generateWork(root, {\n  threshold: RECEIVE_WORK_THRESHOLD,\n  signal: AbortSignal.timeout(30_000),\n  maxIterations: 10_000_000,\n})\n// A 16-character hex nonce, or null when the attempt range is exhausted.\n```\n\nAlso available: `nanopay/amounts`, `/mnemonic`, `/rpc`, `/payments`, and `/confirmations`. Each supports ESM, CommonJS, and TypeScript. The keys entry point contains neither WASM nor the mnemonic word list.\n\nThe WASM engine compiles once per realm, isolates concurrent calls, and yields between batches. `workerIndex` and `workerCount` partition the nonce space; run those calls in separate Workers to use multiple cores. They do not create Workers. Mainnet work is probabilistic; use a GPU work service for sustained workloads. See [measured performance and tradeoffs](docs/performance.md).\n\n## Scope and compatibility\n\nThe toolkit covers local accounts, native and mnemonic derivation, state blocks, signing, work, ledger reads, send/receive/change workflows, confirmation tracking and payment links. `client.request(action, params)` and `rpc.request(...)` expose every additional [Nano RPC command](https://docs.nano.org/commands/rpc-protocol/) supported and enabled by your node.\n\nIt does not run a consensus node, choose a representative, persist or encrypt secrets, manage exchange accounting, or provide a hardware-device transport. External signer hooks allow you to supply your own transport. New blocks use state format; RPC block reads also support historical block contents.\n\nThe original upstream function names and call signatures are preserved under `nanopay/legacy`, including `deriveSecretKey` and the hash-based `signBlock({ hash, secretKey })`. Main imports use `privateKey` consistently and distinguish signing a hash from signing a block. The old nanopay payment-wrapper API is replaced.\n\n## Development and license\n\n```sh\nnpm ci\nnpm run check\nnpm run bench\n```\n\nChecks cover protocol vectors, workflows, browser/Worker execution, formatting, and installation into a clean npm project. Install a browser with `npx playwright install chromium` if Chrome is unavailable. `npm run build:wasm` rebuilds the checked-in binary with LLVM clang and wasm-ld; ordinary builds use the existing binary.\n\nGPL-3.0-only. Based on [nanocurrency-js](https://github.com/marvinroger/nanocurrency-js). Source, build scripts, original notices, and bundled dependency licenses ship with the package. See [LICENSE](LICENSE), [NOTICE](NOTICE), and [CHANGELOG](CHANGELOG.md).\n","readmeFilename":"README.md"}