Skip to content

Node RPC Client for Monero Wallet RPC written in typescript

License

Notifications You must be signed in to change notification settings

dl3br/rx-monero-wallet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

Node RPC Client for Monero Wallet RPC written in typescript

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published