/rx-monero-wallet

Node RPC Client for Monero Wallet RPC written in typescript

Primary LanguageTypeScriptMIT LicenseMIT

Client Monero wallet RPC TypeScript

Client for the monero-wallet-rpc using rxjs

install using npm

npm i rx-monero-wallet

Examples

initialize the wallet object

import { makeUrl, Wallet, Atomic, Xmr, generatePaymentId } from 'rx-monero-wallet'
const url = makeUrl('http', '127.0.0.1', '18082', 'json_rpc');
const wallet = Wallet(url)

then query the address of the current wallet

wallet.getaddress()
  .map((res) => res.address)
  .subscribe(console.log)
9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh

if you prefer working with Promise, query the address with

wallet.getaddress()
  .map((res) => res.address) //optional line, but demonstrates the advantage of Observable over Promise
  .toPromise()
  .then(console.log)
9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh

which is equivalent to:

wallet.getaddress()
  .toPromise()
  .then((res) => console.log(res.address))
9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh

listen to transfers send to the current wallet in mempool

  • the 3 arguments for .subscribe are the following callbacks: onNext, onError and onComplete
  • 1000 is the interval to wait between requests in ms
const autoRefresher = (refreshInterval: number) =>
  Observable.timer(0, refreshInterval)
const streamtransfers = () => autoRefresher(1000)
  .flatMap(() => wallet.get_transfers({ pool: true }))
  .map((res) => res.pool)
  .filter((pool) => pool != undefined)
  .subscribe(console.log,
             console.error,
             () => console.log('finished'))

streamtransfers()
[ { amount: 1000000000000,
    fee: 0,
    height: 0,
    note: '',
    payment_id: '0000000000000000',
    timestamp: 1498741571,
    txid: '21018c28384df394eca65a0bece75ae52611551b458757c844381663bfbad029',
    type: 'pool' } ]

create a block height change detector

const autoRefresher = (refreshInterval: number) =>
  Observable.timer(0, refreshInterval)

const heightChangeDetector = (lastHeight = 0) => autoRefresher(1000)
  .flatMap(() => wallet.getheight())
  .map((res) => res.height)
  .filter((height) => height !== lastHeight)
  .map((height) => lastHeight = height)

const streamheight = () => heightChangeDetector()
  .subscribe(
  console.log,
  (err) => { console.error(err); streamheight() }, // i recover from errors
  () => console.log('finished'))

streamheight()
20838
20839
20840
20842
20843

get the wallets balance

wallet.getbalance()
  .map((res) => new Atomic(res.balance).toXmr().toString())
  .subscribe(console.log)
'707.446307580127'

make an integrated address

wallet.make_integrated_address({ payment_id: generatePaymentId(16) })
  .subscribe(console.log)
{ integrated_address: 'A7Xn9qZeVE1ZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ6HrNTTbikgW5Zm1CGn',
  payment_id: 'a14ba0c1f740c728' }

get payments using a list of payment ids

  • only one paymentid used on this example
wallet.get_bulk_payments({ payment_ids: ['1234567890123456'],
                           min_block_height: 0 })
  .map((res) => res.payments)
  .subscribe(console.log)
[ { amount: 1000000000000,
    block_height: 12132,
    payment_id: '1234567890123456',
    tx_hash: 'ccd72c2394ad840fc6f0d475ac612e6cbe983ab9db953d7f3c7831c4caa40699',
    unlock_time: 0 } ]

Donation

if the library is useful for you, consider throwing XMR to:

42Eky2DHrD5NYyrgfB48dBJ8YPBN1MBxTTWb5V9KgPT2SSBkmukzW4pJnkWuGomc1u7Mw28FNTW6a7TUaZHdAcVD2CHvmc5

if it annoys you, try to steal from that wallet.

References

Reference for using monero’s wallet rpc from which this library derives: https://getmonero.org/knowledge-base/developer-guides/wallet-rpc

It might fit together with https://github.com/cryptoshrimpi/monerod-js that communicates with the monero daemon with typescript

I based myself on https://github.com/PsychicCat/monero-nodejs for the utils

Types and Typescript and Observables

I added most of the types, thus please use a text editor with decent support for typescript for getting all the autocompletion and typechecking magic, and enjoy the coding experience without having to console.log everything

I wrote this library using functional reactive programming (to learn about it), in special the Observable monad. There’s a real benefit to have a type system when using Observables, as one can map over objects (with autocompletion) that were not yet observed.