{"_id":"@algorandfoundation/ledger-algorand-js","_rev":"5-5e4110440f490c0ff23499375ee20f34","name":"@algorandfoundation/ledger-algorand-js","dist-tags":{"latest":"1.4.3"},"versions":{"0.0.1":{"name":"@algorandfoundation/ledger-algorand-js","version":"0.0.1","keywords":[],"author":"","license":"MIT","_id":"@algorandfoundation/ledger-algorand-js@0.0.1","maintainers":[{"name":"bruno.martins.algorand.foundation","email":"bruno.martins@algorand.foundation"},{"name":"dev_algorand.foundation","email":"dev+npm@algorand.foundation"},{"name":"shane-at-algo","email":"shane.mcgovern@algorand.foundation"},{"name":"hmd2v","email":"yared@679labs.com"},{"name":"joe-p","email":"joepolny@gmail.com"},{"name":"bitd13co","email":"bit@d13.co"},{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"dist":{"shasum":"7e6d9f9da5687685d15672fdf2265da6c4f6443e","tarball":"https://registry.npmjs.org/@algorandfoundation/ledger-algorand-js/-/ledger-algorand-js-0.0.1.tgz","fileCount":3,"integrity":"sha512-Hl5xh3ge9VUHY/QLq3hxn3X/9rEax4SR3dzYIM1zWMfWnns216vk8Io4qzaUt3TDT/p2SPWS4fwJedMqeS8sDw==","signatures":[{"sig":"MEUCIC0kBG7fCEaqcYcbSUxIhNbzyLFy2qFDYe1ezUPR8nFuAiEA2xzbGpdfnGpbeUTvXrkLxTdQmpGCCSHTe3KREhcHECo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":606},"main":"index.js","type":"commonjs","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"dev_algorand.foundation","email":"dev+npm@algorand.foundation"},"_npmVersion":"11.6.0","description":"Ledger integration for Algorand in JS","directories":{},"_nodeVersion":"24.8.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ledger-algorand-js_0.0.1_1759223444519_0.9672626379142204","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@algorandfoundation/ledger-algorand-js","version":"1.4.3","keywords":["Algorand Foundation","Ledger","Typescript","Javascript","Algorand"],"author":{"name":"Algorand Foundation"},"license":"Apache-2.0","_id":"@algorandfoundation/ledger-algorand-js@1.4.3","maintainers":[{"name":"bruno.martins.algorand.foundation","email":"bruno.martins@algorand.foundation"},{"name":"dev_algorand.foundation","email":"dev+npm@algorand.foundation"},{"name":"shane-at-algo","email":"shane.mcgovern@algorand.foundation"},{"name":"hmd2v","email":"yared@679labs.com"},{"name":"joe-p","email":"joepolny@gmail.com"},{"name":"bitd13co","email":"bit@d13.co"},{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"homepage":"https://github.com/algorandfoundation/ledger-algorand-js","bugs":{"url":"https://github.com/algorandfoundation/ledger-algorand-js/issues"},"dist":{"shasum":"9836f0cdba1a2d814cb3a073c620c10a1f7ec941","tarball":"https://registry.npmjs.org/@algorandfoundation/ledger-algorand-js/-/ledger-algorand-js-1.4.3.tgz","fileCount":25,"integrity":"sha512-cypHJx5Jdwvhix93NIdfbHXT+dj7nSY4wZpGt/7YmYR/X5sIGmEEaKB8rrkRk14H/mdpFjz1Z35KfE08C5T8LA==","signatures":[{"sig":"MEYCIQCqDmYflPj9eAgTxPVw0O/HYRu2RXLHDa0eXWYmR5/LyQIhANavHDcoTguxDK2slNMmwg33FVpjETo6mLVNKORrdzew","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@algorandfoundation%2fledger-algorand-js@1.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":115568},"main":"./dist/index.js","types":"./dist/index.d.ts","gitHead":"4be7721bf127d69b68c94257866d4e72fae80940","scripts":{"lint":"eslint . --ext .ts","test":"npx vitest --run","build":"tsc","clean":"rm -rf dist","format":"FORCE_COLOR=1 prettier --write . && sort-package-json","lint:fix":"eslint . --fix --ext .ts","lint:check":"eslint . --ext .ts --max-warnings 0","format:check":"FORCE_COLOR=1 prettier --check . && sort-package-json -c","test:coverage":"npx vitest --run --coverage","prepublishOnly":"npm run build","semantic-release":"npm run semantic-release"},"typings":"./dist/index.d.ts","_npmUser":{"name":"dev_algorand.foundation","email":"dev+npm@algorand.foundation"},"repository":{"url":"git+https://github.com/algorandfoundation/ledger-algorand-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Node API for the Algorand App (Ledger Nano S/X/S+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"@zondax/ledger-js":"^1.3.1","@ledgerhq/hw-transport":"^6.31.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"bip32":"^4.0.0","bip39":"^3.1.0","eslint":"^9.23.0","vitest":"^3.0.9","core-js":"^3.41.0","prettier":"^3.5.3","crypto-js":"4.2.0","secp256k1":"^5.0.1","typescript":"^5.8.2","@types/node":"^22.17.0","semantic-release":"^24.2.9","sort-package-json":"^2.15.1","@vitest/coverage-v8":"^3.0.9","eslint-plugin-import":"^2.31.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.28.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.28.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/ledger-algorand-js_1.4.3_1759420185063_0.9515924573691821","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-09-30T09:10:44.396Z","modified":"2026-04-08T12:51:27.307Z","0.0.1":"2025-09-30T09:10:44.717Z","1.4.3":"2025-10-02T15:49:45.306Z"},"bugs":{"url":"https://github.com/algorandfoundation/ledger-algorand-js/issues"},"author":{"name":"Algorand Foundation"},"license":"Apache-2.0","homepage":"https://github.com/algorandfoundation/ledger-algorand-js","keywords":["Algorand Foundation","Ledger","Typescript","Javascript","Algorand"],"repository":{"url":"git+https://github.com/algorandfoundation/ledger-algorand-js.git","type":"git"},"description":"Node API for the Algorand App (Ledger Nano S/X/S+)","maintainers":[{"email":"bruno.martins@algorand.foundation","name":"bruno.martins.algorand.foundation"},{"email":"dev+npm@algorand.foundation","name":"dev_algorand.foundation"},{"email":"shane.mcgovern@algorand.foundation","name":"shane-at-algo"},{"email":"joepolny@gmail.com","name":"joe-p"},{"email":"bit@d13.co","name":"bitd13co"},{"email":"kyle.breeding@algorand.foundation","name":"krby"}],"readme":"# @algorandfoundation/ledger-algorand-js\n\n![GitHub License](https://img.shields.io/github/license/algorandfoundation/ledger-algorand-js)\n\n![NPM Version](https://img.shields.io/npm/v/%40algorandfoundation%2Fledger-algorand-js)\n\nThis package provides a basic client library to communicate with the Algorand App running on a Ledger device.\n\nWe recommend using the NPM package in order to receive updates/fixes.\n\n# Integration Guidance\n\n### Transport Options\n\nTo use this library, you need to create a transport instance that connects to your Ledger device. The transport layer handles communication between your application and the Ledger hardware wallet. Choose a transport based on your application environment:\n\n#### Available Transport Packages\n\n| Transport Package                                                                                                      | Environment          |\n| ---------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| [`@ledgerhq/hw-transport-webusb`](https://www.npmjs.com/package/@ledgerhq/hw-transport-webusb)                         | Web                  |\n| [`@ledgerhq/hw-transport-web-ble`](https://www.npmjs.com/package/@ledgerhq/hw-transport-web-ble)                       | Web (with Bluetooth) |\n| [`@ledgerhq/hw-transport-node-hid`](https://www.npmjs.com/package/@ledgerhq/hw-transport-node-hid)                     | Node/Electron        |\n| [`@ledgerhq/hw-transport-node-hid-singleton`](https://www.npmjs.com/package/@ledgerhq/hw-transport-node-hid-singleton) | Node.js/Electron     |\n| [`@ledgerhq/hw-transport-http`](https://www.npmjs.com/package/@ledgerhq/hw-transport-http)                             | Any                  |\n\n## API\n\n### getVersion\n\nThe `getVersion` method retrieves the version information from the Algorand Ledger app.\n\n```typescript\nimport { AlgorandApp } from '@algorandfoundation/ledger-algorand-js'\n\n// Select transport based on your needs\nconst transport = getTransport()\nconst app = new AlgorandApp(transport)\n\ntry {\n  const response = await app.getVersion()\n  console.log(`Version: ${response.major}.${response.minor}.${response.patch}`)\n  console.log(`Test mode: ${response.testMode}`)\n  console.log(`Device locked: ${response.deviceLocked}`)\n} catch (error) {\n  // Handle error\n} finally {\n  transport.close()\n}\n```\n\n### getAddressAndPubKey\n\nThe `getAddressAndPubKey` method retrieves the Algorand public key and address from the Ledger device.\n\n```typescript\nimport { AlgorandApp } from '@algorandfoundation/ledger-algorand-js'\n\n// Select transport based on your needs\nconst transport = getTransport()\nconst app = new AlgorandApp(transport)\n\ntry {\n  // Parameters:\n  // accountId (optional): defaults to 0\n  // requireConfirmation (optional): if true, shows the address on device for verification\n  const response = await app.getAddressAndPubKey(0, false)\n  console.log('Address:', response.address.toString())\n  console.log('Public Key:', response.publicKey.toString('hex'))\n} catch (error) {\n  // Handle error\n} finally {\n  transport.close()\n}\n```\n\n### sign\n\nThe `sign` method allows you to sign a transaction with the Algorand Ledger app.\n\n```typescript\nimport { AlgorandApp } from '@algorandfoundation/ledger-algorand-js'\n\n// Select transport based on your needs\nconst transport = getTransport()\nconst app = new AlgorandApp(transport)\n\n// Blob to sign (Algorand transaction)\nconst txBlob = Buffer.from(transaction)\n\ntry {\n  // Parameters:\n  // accountId (optional): defaults to 0\n  // txBlob: string or Buffer containing the data to sign\n  const response = await app.sign(0, txBlob)\n  console.log('Signature:', response.signature.toString('hex'))\n} catch (error) {\n  // Handle error\n} finally {\n  transport.close()\n}\n```\n\n### SignData\n\nThe `signData` method allows you to sign arbitrary data with the Algorand Ledger app.\n\n```typescript\nimport { createHash } from 'crypto'\nimport {\n  AlgorandApp,\n  ResponseAddress,\n  ScopeType,\n  StdSigData,\n} from '@algorandfoundation/ledger-algorand-js'\n\n// Import or define your canonify function\n\n// Select transport based on your needs\nconst transport = getTransport()\nconst app = new AlgorandApp(transport)\n\nconst addressAndPubkey: ResponseAddress = await app.getAddressAndPubKey()\nconst pubBuf = addressAndPubkey.publicKey\n\nconst req = {\n  type: 'foo',\n  origin: 'bar',\n}\n\nconst domain: string = 'dummyDomain'\n\nconst signingData: StdSigData = {\n  // Base64-encoded canonified JSON\n  data: Buffer.from(canonify(req)).toString('base64'),\n  signer: pubBuf,\n  domain: domain,\n  // Uppercase Hex String, Base64-encoded\n  requestId: Buffer.from(Array(32).fill(0x41)).toString('base64'),\n  authenticationData: new Uint8Array(\n    createHash('sha256').update(domain).digest()\n  ),\n  hdPath: \"m/44'/283'/0'/0/0\",\n}\n\nconst metadata = {\n  scope: ScopeType.AUTH,\n  encoding: 'base64',\n}\n\ntry {\n  const response = await app.signData(signingData, metadata)\n  console.log('Signature:', response.signature.toString())\n} catch (error: any) {\n  // Handle error\n} finally {\n  transport.close()\n}\n```\n\n#### metadata\n\n- `scope` (number): Scope identifier (currently only `ScopeType.AUTH` (1) is supported)\n- `encoding` (string): Data encoding format (currently only \"base64\" is supported)\n\n#### Error Handling (signData specific)\n\nThe signData method may throw specific errors. These errors are available in the app's [APDUSPEC](https://github.com/algorandfoundation/app-algorand/blob/main/docs/APDUSPEC.md#arbitrary-sign-return-codes)\n\n## Notes\n\nUse `npm install` to avoid issues.\n","readmeFilename":"README.md"}