{"id":19391928,"url":"https://github.com/fwd/nano-js","last_synced_at":"2025-06-11T11:14:54.175Z","repository":{"id":103798121,"uuid":"588689476","full_name":"fwd/nano-js","owner":"fwd","description":"JavaScript Nano Wallet","archived":false,"fork":false,"pushed_at":"2025-02-03T04:18:53.000Z","size":4113,"stargazers_count":15,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-29T05:40:18.409Z","etag":null,"topics":["browser","nanocurrency","nodejs","npm","wallet"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fwd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-01-13T18:40:27.000Z","updated_at":"2025-04-09T10:23:44.000Z","dependencies_parsed_at":"2024-11-10T10:30:53.460Z","dependency_job_id":"80acf139-4c43-448e-b503-00b67b215147","html_url":"https://github.com/fwd/nano-js","commit_stats":null,"previous_names":["fwd/nano-offline"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwd%2Fnano-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwd%2Fnano-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwd%2Fnano-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwd%2Fnano-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fwd","download_url":"https://codeload.github.com/fwd/nano-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwd%2Fnano-js/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259253182,"owners_count":22829142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","nanocurrency","nodejs","npm","wallet"],"created_at":"2024-11-10T10:29:44.436Z","updated_at":"2025-06-11T11:14:54.118Z","avatar_url":"https://github.com/fwd.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n\u003ch1 align=\"center\"\u003eNano JS Wallet\u003c/h1\u003e\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n**BROWSER:**\n```html\n\u003cscript src=\"https://unpkg.com/@nano/wallet\"\u003e\u003c/script\u003e\n```\n\n**NPM:**\n```js\n// npm install @nano/wallet\nconst nano = require('@nano/wallet')\n```\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n## Basic Usage\n\n```js\n// npm install @nano/wallet\nconst nano = require('@nano/wallet')\n\nnano.app({\n    node: 'https://rpc.nano.to',\n    database: 'encrypted_wallet.txt',\n    secret: 'SUPER_SECRET_PASSWORD'\n})\n\n;(async () =\u003e {\n\nvar payment = await nano.checkout({\n    amount: '0.00133'\n})\n\nconsole.log( payment.browser )\n\nvar success = await nano.waitFor(payment)\n\nvar receive = await nano.receive()\n\nvar send = await nano.send({\n    to: 'YOUR_FRIENDS_ADDRESS',\n    amount: '0.00133'\n})\n\nconsole.log( send )\n\n})()\n```\n\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n## OFFLINE API\n\n```js\nnano.generate()\n```\n```js\nnano.import( nano.generate() )\n```\n```js\nnano.accounts()\n```\n```js\nnano.add_account()\n```\n```js\nnano.sign(block)\n```\n```js\nnano.convert('421.70', 'NANO', 'RAW') // 421700000000000000000000000000000\n```\n```js\nnano.encrypt('any_string', process.env.PASSWORD) // AES-256\n```\n```js\nnano.decrypt('any_string', process.env.PASSWORD) // UTF-8\n```\n```js\nnano.export()\n```\n\n## PUBLIC RPC\n\n```js\nvar qrcode = await nano.qrcode()\nconsole.log( qrcode ) // base64:png..\n```\n\n```js\nvar checkout = await nano.checkout({ address: 0, amount: '0.133' })\nconsole.log( checkout )\n// {\n//     \"id\": \"CHECKOUT_ID\",\n//     \"browser\": \"https://nano.to/id_CHECKOUT_ID\",\n//     \"json\": \"https://api.nano.to/checkout/CHECKOUT_ID\",\n//     \"check\": \"https://api.nano.to/check/CHECKOUT_ID\",\n//     \"address\": \"YOUR_ADDRESS\",\n//     \"qrcode\": \"data:image/png;base64\"\n// }\n```\n\n```js\nvar payment = await nano.waitFor(checkout)\nconsole.log( payment )\n// {\n//     id: 'b06a8127',\n//     success: true,\n//     block: '3C0D9A50649C6BE04263...A773C321EDD2603EFEB',\n//     json: 'https://api.nano.to/checkout/b06a8127',\n//     address: 'nano_37y6iq8m...xpb9jrcwhkmoxpo61f4o',\n//     browser: 'https://nanobrowse.com/block/3C0D9A50649C6BE04263...A773C321EDD2603EFEB',\n//     amount: '0.133',\n//     amount_raw: '1330000000000000000000000'\n// }\n```\n\n```js\n// get all balances\nawait nano.balances()\n// get balance of specific address\nawait nano.balance({ userId: 'johnDoe' })\n// {\n//     \"balance\": \"325586539664609129644855132177\",\n//     \"pending\": \"2309372510769300000000000000000000\",\n//     \"receivable\": \"2309372510769300000000000000000000\",\n//     \"balance_nano\": \"0.32558653966460912964\",\n//     \"pending_nano\": \"2309.3725107693\",\n//     \"receivable_nano\": \"2309.3725107693\"\n// }\n```\n\n```js\n// receive all\nawait nano.receive()\n// receive all for specific address\nawait nano.receive({ userId: 'johnDoe' })\n// [\n//   {\n//     hash: '6147D4B0632E522E91D8DB48E0ACA0D96A19A7149E69EDEB24FE92C039EB5C8C',\n//     amount: '1000000000000000000000000',\n//     amount_nano: '0.000001000000000000000000000000',\n//     source: 'nano_37y6iq8m1zx9inwkkcgqh34kqsihzpjfwgp9jir8xpb9jrcwhkmoxpo61f4o',\n//     send_hash: 'A32EEDA7589290B49A2D724BB1F0ADB7A631C626447D8A29998858CA272714B4'\n//   }\n// ]\n```\n\n```js\n// send to globally known accounts\nawait nano.send({ to: '@fosse', amount: 0.1 })\n\n// send to multiple accounts\nawait nano.send({ to: [ '@fosse', '@bank' ], amount: 0.1 })\n\n// send all funds on address\nawait nano.send({ to: '@fosse', amount: 'all' })\n\n// transfer between your own accounts\nawait nano.send({ to: 1, from: 0, amount: 0.1 })\n\n// transfer between your own users\nawait nano.send({ to: { userId: 'johnDoe' }, from: { userId: 'janeDoe' }, amount: 0.1 })\n\n// [\n//   {\n//     to: 'nano_1bank1q3q7x8rimo3hf6qu6ezq3fmtximyt8kggtfaosg8kyr51qsdkm8g45',\n//     from: 'nano_1komhob8amguaora5zkt4u3ybiz35he1g7puuxfqe5ywjc1tkf6pm1nqprp3',\n//     hash: 'BCF9F79EEE7A26010465DB587206AB57735079DDE2242DFC6B9300EE0D27955C',\n//     amount: '1000000000000000000000000',\n//     browser: 'https://nanobrowse.com/block/BCF9F79EEE7A26010465DB587206AB57735079DDE2242DFC6B9300EE0D27955C'\n//   }\n// ]\n```\n\n```js\nawait nano.rpc({ action: \"block_count\" })\n\n// {\n//     \"count\": \"199484966\",\n//     \"unchecked\": \"8\",\n//     \"cemented\": \"199484966\",\n//     \"node\": \"@humblenano-1\"\n// }\n```\n\n## MANUAL SIGNING\n\n**SEND**\n\n```js\nvar send = nano.sign({\n    walletBalanceRaw: '18618869000000000000000000000000',\n    toAddress: 'nano_3kyb49tqpt39ekc49kbej51ecsjqnimnzw1swxz4boix4ctm93w517umuiw8',\n    representativeAddress: 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou',\n    frontier: '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D',\n    transactionHash: 'CBC911F57B6827649423C92C88C0C56637A4274FF019E77E24D61D12B5338783',\n    amountRaw: '7000000000000000000000000000000',\n}, process.env.PRIVATE_KEY) \n```\n\n**RECEIVE**\n\n```js\nvar receive = nano.sign({\n    walletBalanceRaw: '18618869000000000000000000000000',\n    toAddress: 'nano_3kyb49tqpt39ekc49kbej51ecsjqnimnzw1swxz4boix4ctm93w517umuiw8',\n    representativeAddress: 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou',\n    frontier: '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D',\n    transactionHash: 'CBC911F57B6827649423C92C88C0C56637A4274FF019E77E24D61D12B5338783',\n    amountRaw: '7000000000000000000000000000000',\n    work: 'c5cf86de24b24419',\n}, process.env.PRIVATE_KEY) \n\nvar hash = await nano.process( receive )\n```\n\n**CHANGE_REP**\n\n```js\nvar change_rep = nano.sign({\n    walletBalanceRaw: '3000000000000000000000000000000',\n    address: 'nano_3igf8hd4sjshoibbbkeitmgkp1o6ug4xads43j6e4gqkj5xk5o83j8ja9php',\n    representativeAddress: 'nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs', // new rep\n    frontier: '128106287002E595F479ACD615C818117FCB3860EC112670557A2467386249D4',\n    work: '0000000000000000',\n}, process.env.PRIVATE_KEY) \n\nvar hash = await nano.process( change_rep )\n```\n\n**SIGNED**\n\n```\n{\n  type: 'state',\n  account: 'nano_3kyb49tqpt39ekc49kbej51ecsjqnimnzw1swxz4boix4ctm93w517umuiw8',\n  previous: '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D',\n  representative: 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou',\n  balance: '25618869000000000000000000000000',\n  link: 'CBC911F57B6827649423C92C88C0C56637A4274FF019E77E24D61D12B5338783',\n  signature: 'd5dd2a53becfc8c3fd17ddee2aba651ef6ac28571b66a4dfb2f4820c7d04d235d226d1fb176eb3958bbbfb9145663a0b4ffffd59cfc4b23af24a2af5f51e6a0e',\n  work: ''\n}\n```\n\n## LOCALSTORAGE\n\n\u003e Build non-custodial Nano applications by persisting Wallets client-side. Using AES-256 encryption. The longer ```SUPER_SECRET_PASSWORD```, the more secure. \n\n```js\nnano.app({ \n    node: 'https://rpc.nano.to',\n    rpc_key: 'RPC_API_KEY', // get free key @ rpc.nano.to\n    database: 'aes_string.txt', \n    secret: 'SUPER_SECRET_PASSWORD'\n})\n\nconsole.log( nano.accounts() )\n\nawait nano.receive()\n\nawait nano.send({ to: '@faucet', amount: 0.001 })\n```\n\n## METADATA\n\n```js\nnano.app({ \n    node: 'https://rpc.nano.to',\n    rpc_key: 'RPC_API_KEY', // get free key @ rpc.nano.to\n    database: 'aes_string.txt', \n    secret: 'SUPER_SECRET_PASSWORD'\n})\n\nconst user = { userId: 'JoeDoe' }\n\nconsole.log( nano.add_account(user) )\n\nawait nano.receive(user)\n\nvar balance = await nano.balance(user)\n\nconsole.log( balance )\n\nawait nano.send({ \n    to: user, \n    from: 0, // wallet with index of 0\n    amount: '0.0000133'\n})\n```\n\n## EXPORT WALLET\n\n\u003e JSON object, stringified and encrypted with AES-256\n\n```js\n\nnano.offline({ \n    filename: 'aes_string.txt', \n    password: process.env.PASSWORD\n})\n\nconsole.log( nano.export() )\n\n```\n\n**Encrypted:**\n```text\nAES-256::U2FsdGVkX1+jBdpxz6hMNOqWmidZQPqHjOHq7sGi94U0dMuPZsDfPRGVVDVQH5ZfvXku6aqEfmoR9LwoBbKKxGxrAzOwf2SvNcmvwdAsgAkmieOwVOCDbob46yMN7TZUnRDIOSNq3tEozfaf9vbH3SdRZgkCukblN5m+lA0yxKSDaPiczANZMgP6NdtjMNo2SHVVmJhWgz4i8MDCfk6ZeZChxL6UyuqR0hKyY0wEtXHndTapQuVYQ/Oyvb9ccNfqvgxirmYERiXPEFi/vndPwmS2AEGih7fWndSARkXtLgG3xTI2tWYvoMIef4ZouiFtOhfOXuiab0OteoQmlmW6C03Nb4e2SZrFyyIF9wWkXDcpHSqPBUJJzOPF/p8c8fyEbhpe/iEs6pObrLOSoh8S+t016ZF3ARntCeBtMVZCiwVS94Ru+zGcDVxJiny/oBywznxPlkCAnf4m5Tn6E9LpeLdi14feuGTCerGYW3MYM3jJbqUGRuaGw6OB1hRcKtpe3QLR/lmnw1jRkpux6K+5P2p4GsacK/l0Ul5caGnCeQWeDll3q8DIFD4Qhvp1qnawhMvpYu/RCwVTGvLFlkhYS/DruJEQuVErHK8bhfAvPZaF3Eyw5qzCoUaukcl2S1i5HzPsMgcxSfRxCmCH37bKd8YfE3wiC+7AatsN1QOvzzY=\n```\n\n**Decrypted:**\n```json\n{\n    \"mnemonic\": \"body hire team image luxury banana panther tiny clog beauty only cover frost tourist process grit unlock rice\",\n    \"seed\": \"7202a6eb69fa3a465539648c35e55ad7e295f25c9a7a340f82b3d3e338f....33a4ee0939cd44a7abb1afe83ff2170cae4\",\n    \"accounts\": [{\n        \"accountIndex\": 0,\n        \"private\": \"d7cace49b3a20f83.....58cb61b8f2ef84f3\",\n        \"address\": \"nano_1h4ymsbu....3wotjakm1copzy56bd8na\"\n    }]\n}\n```\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n## GET FREE NANO\n\n- https://nanodrop.io/\n- https://freenanofaucet.com/\n- https://faucet.prussia.dev/nano\n- https://getnano.ovh/faucet\n\n## License\n\nMIT\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n## Sponsor (DigitalOcean)\n\n\u003ca align=\"center\" target=\"_blank\" href=\"https://m.do.co/c/f139acf4ddcb\"\u003e\u003cimg style=\"object-fit: contain;\n    max-width: 100%;\" src=\"https://github.com/fwd/fwd/raw/master/ads/digitalocean_new.png\" width=\"970\" /\u003e\u003c/a\u003e\n\n![line](https://github.com/nano-currency/node-cli/raw/main/.github/line.png)\n\n## Stargazers\n\n[![Stargazers over time](https://starchart.cc/fwd/nano-js.svg)](https://github.com/fwd/nano-js)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffwd%2Fnano-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffwd%2Fnano-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffwd%2Fnano-js/lists"}