Skip to content
ruby client for monero-wallet-rpc
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Monero Ruby Client

Ruby client to connect and use Monero Wallet RPC.

Tested against v0.13.0.4 Beryllium Bullet without issues. Please contribute. If you want to send testnet transactions, please always send them back to

Disclaimer - before you start - important notice!

To try out please make sure that you run your monerod and your monero-wallet-rpc with the --stagenet or --testnet option. Always use the stagenet or testnet to play around. Be careful with your wallet, you might lose coins if you try out on the real chain.


For easy installation add gem 'monero' to your Gemfile or run gem install monero


Start your daemon ./monerod --testnet

Start your RPC Client ./monero-wallet-rpc --testnet --rpc-bind-port 28081 --rpc-bind-ip --rpc-login username:password --log-level 4

  • To open a wallet at start use --wallet-file filename and --password pass
  • In case you need to access the client from another machine, you need to set --confirm-external-bind.
  • To be able to create/open other wallets you need to specify --wallet-file /path/to/wallets/on/your/machine
  • if you don't specify --rpc-login a file will be created that stores the login data (cat monero-wallet-rpc.28081.login)

You can also use monerod-rpc-docker by xaviablaza to run monerod and the RPC client.

Getting started

Configuration = ""
RPC.config.port = "18081"
RPC.config.username = "username"
RPC.config.password = "password"
RPC.config.transfer_clazz = "MoneroTransfer" # you can set your own class to get incoming transfers as a model rather then a json


Monero Ruby Client is very easy to use. Full documentation of RPC Client:

Get the current address

=> "9wm6oNA5nP3LnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9HjTDpKXAE"

Create a new subaddress with a label

RPC::Wallet.create_address "family savings"
=> {"address"=>"BZFWM5MrhK64DD5TH1JVxR4JbuQpmRSFKi4SHQD2TrSrDFU8AK16YSjN7K8WSfjAfnZeJeskBtkgr73LbPZc4vMbQr3YvHj", "address_index"=>1}

Create a new address for a payment (integrated address)

=> {"integrated_address"=>"A7TmpAyaPeZLnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9HjfufSYUchQ8hH2R272H",

Get a list of all addresses of your wallet


To get the balance of the current wallet (we use the gem 'money')

# returns an ::XMR object which is just a shortcut for ::Money(amount, :xmr)
=> <Money fractional:9980629640000 currency:XMR>

=> "9.980629640000 XMR"

To get the unlocked balance, which is currently available

=> <Money fractional:10000 currency:XMR>

To get both combined

=> {"balance"=>9961213880000, "unlocked_balance"=>10000}

To get the current block height

=> 1008032

Send XMR to an address via RPC::Transfer.create. If successful you will get the transaction details. If not successful you'll get returned nil.

amount= 20075 # in atomic units; 1000000000000 == 1.0 XMR
RPC::Transfer.create("A7TmpAyaPeZLnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9HjfwGRvbCHYCZAaKSzDx", amount)
=> {"fee"=>19415760000,

The return hash consists of:

{amount, fee, multisig_txset, tx_blog, tx_hash, tx_key, tx_metadata,

To send payments you can also specify the following options:

options = { fee: fee, mixin: 5, unlock_time: unlock_time, payment_id: "c7e7146b3335aa54", get_tx_key: true, priority: 0, do_not_relay: false, get_tx_hex: true}

Please note that fee is currently ignored by the chain.

To send payments to multiple recipients simply use an array of [:recipient, :amount]. For example:

recipients = [
  {address:"A7TmpAyaPeZLnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9HjfwGRvbCHYCZAaKSzDx" amount: 1599999},
  {address:"A7TmpAyaPeZLnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9Hjftr1RgJ6RM4BMMPLUc" amount: 130000},
  {address:"A7TmpAyaPeZLnugTKRSwGJhW4vnYv8RAVdRvYyvbistbHUnojyTHyHcYpbZvbTZHDsi4rF1EK5TiYgnCN6FWM9HjfrgPgAEasYGSVhUdwe" amount: 442130000}

RPC::Transfer.send_bulk(recipients, options)

To get a list of transfers you call get_transfers(args). Options are in (true), out (false), pending (true), failed (false), pool (true), filter_by_height (false), min_height and max_height

To get all incoming transfers use get_all_incoming_transfers(args). Args can be min_height and max_height to filter accordingly. Result is a list of RPC::IncomingTransfer objects.

incomes = RPC::Wallet.get_all_incoming_transfers(min_height: 1087400)
=> [#<RPC::IncomingTransfer:0x000000036d3ca8 ...>, #<RPC::IncomingTransfer:0x000000036d38c0 ...>, #<RPC::IncomingTransfer:0x000000036d3258 ...>, #<RPC::IncomingTransfer:0x000000036d2c90 ...> ....

=> false

=> true

=> 0

=> "9vN5sHeH2a6AbRsB1dZ3APavL3YyFLguhh5pu2cAHb4CTY9GtnsEsBYTzwxzL6XH4Uby2Svju8sYvZN7mDMcd6MTKDvBgVR"

=> 0.40123

You can use your own custom class by using the config RPC.config.transfer_clazz = "MyCustomMoneroTransfer"

For a specific Transfer simply call get_transfer_by_txid(tx_id)

Running tests

Configure the RPC singleton in spec_helper.rb


If this was useful you might consider a small donation:



Even better would be your contribution to the code. Let's work together and make this gem a great place for all Monero fans! Don't just fork and do your own thing. My idea for this gem isn't the way we have to do. Feel free to bring yourself into this project. I'm willing to change everything from scratch if it will benefit the future.


This gem is available as open source under the terms of the MIT License.

You can’t perform that action at this time.