Full Monero RPC client(Wallet AND Daemon) written in go

Monero RPC Client in Go

Build Status Go Report Card GoDoc License MIT

Full Monero RPC client(Wallet AND Daemon) written in go

Version

Client was written per docs on getmonero.org.

Last update on docs was on 2018-09-14 after merged commit bb30a7236725e456138f055f96a634c75ce2b491 (Wallet RPC version 1.3), and at block height 1643308.

Preposition

Running monerod with RPC enabled

Installation

go get github.com/MarinX/monerorpc

Usage

import "github.com/MarinX/monerorpc"

Wallet example

package main

import (
	"fmt"

	"github.com/MarinX/monerorpc"
)

func main() {
	// create a new client for Testnet
	client := monerorpc.New(monerorpc.TestnetURI, nil)

	// if your monerod is protected, set username/password
	client.SetAuth("username", "password")

	// call RPC endpoint
	ver, err := client.Wallet.GetVersion()
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Printf("Wallet version %d\n", ver.Version)
}

Wallet methods

type Wallet interface {
	// SetDaemon connects the RPC server to a Monero daemon.
	SetDaemon(req *SetDaemonRequest) error
	// GetBalance Return the wallet's balance.
	GetBalance(req *GetBalanceRequest) (*GetBalanceResponse, error)
	// GetAddress Return the wallet's addresses for an account. Optionally filter for specific set of subaddresses.
	GetAddress(req *GetAddressRequest) (*GetAddressResponse, error)
	// GetAddressIndex Get account and address indexes from a specific (sub)address
	GetAddressIndex(req *GetAddressIndexRequest) (*GetAddressIndexResponse, error)
	// CreateAddress Create a new address for an account. Optionally, label the new address.
	CreateAddress(req *CreateAddressRequest) (*CreateAddressResponse, error)
	// LabelAddress Label an address.
	LabelAddress(req *LabelAddressRequest) error
	// ValidateAddress Analyzes a string to determine whether it is a valid monero wallet address and returns the result and the address specifications.
	ValidateAddress(req *ValidateAddressRequest) (*ValidateAddressResponse, error)
	// GetAccount Get all accounts for a wallet. Optionally filter accounts by tag.
	GetAccounts(req *GetAccountsRequest) (*GetAccountsResponse, error)
	// CreateAccount Create a new account with an optional label.
	CreateAccount(req *CreateAccountRequest) (*CreateAccountResponse, error)
	// LabelAccount Label an account.
	LabelAccount(req *LabelAccountRequest) error
	// GetAccountTags Get a list of user-defined account tags.
	GetAccountTags() (*GetAccountTagsResponse, error)
	// TagAccounts Apply a filtering tag to a list of accounts.
	TagAccounts(req *TagAccountsRequest) error
	// UntagAccount Remove filtering tag from a list of accounts.
	UntagAccounts(req *UntagAccountsRequest) error
	// SetAccountTagDescription Set description for an account tag.
	SetAccountTagDescription(req *SetAccountTagDescriptionRequest) error
	// GetHeight Returns the wallet's current block height.
	GetHeight() (*GetHeightResponse, error)
	// Transfer Send monero to a number of recipients.
	Transfer(req *TransferRequest) (*TransferResponse, error)
	// TransferSplit Same as transfer, but can split into more than one tx if necessary.
	TransferSplit(req *TransferSplitRequest) (*TransferSplitResponse, error)
	// SignTransfer Sign a transaction created on a read-only wallet (in cold-signing process)
	SignTransfer(req *SignTransferRequest) (*SignTransferResponse, error)
	// SubmitTransfer Submit a previously signed transaction on a read-only wallet (in cold-signing process)
	SubmitTransfer(req *SubmitTransferRequest) (*SubmitTransferResponse, error)
	// SweepDust Send all dust outputs back to the wallet's, to make them easier to spend (and mix).
	SweepDust(req *SweepDustRequest) (*SweepDustResponse, error)
	// SweepAll Send all unlocked balance to an address.
	SweepAll(req *SweepAllRequest) (*SweepAllResponse, error)
	// SweepSingle Send all of a specific unlocked output to an address.
	SweepSingle(req *SweepSingleRequest) (*SweepSingleResponse, error)
	// RelaxTx Relay a transaction previously created with "do_not_relay":true.
	RelayTx(req *RelayTxRequest) (*RelayTxResponse, error)
	// Store Save the wallet file.
	Store() error
	// GetPayments Get a list of incoming payments using a given payment id.
	GetPayments(req *GetPaymentsRequest) (*GetPaymentsResponse, error)
	// GetBulkPayments Get a list of incoming payments using a given payment id, or a list of payments ids, from a given height.
	// This method is the preferred method over get_payments because it has the same functionality but is more extendable.
	// Either is fine for looking up transactions by a single payment ID.
	GetBulkPayments(req *GetBulkPaymentsRequest) (*GetBulkPaymentsResponse, error)
	// IncomingTransfers Return a list of incoming transfers to the wallet.
	IncomingTransfers(req *IncomingTransfersRequest) (*IncomingTransfersResponse, error)
	// QueryKey Return the spend or view private key.
	QueryKey(req *QueryKeyRequest) (*QueryKeyResponse, error)
	// MakeIntegratedAddress Make an integrated address from the wallet address and a payment id.
	MakeIntegratedAddress(req *MakeIntegratedAddressRequest) (*MakeIntegratedAddressResponse, error)
	// SplitIntegratedAddress Retrieve the standard address and payment id corresponding to an integrated address.
	SplitIntegratedAddress(req *SplitIntegratedAddressRequest) (*SplitIntegratedAddressResponse, error)
	// StopWallet Stops the wallet, storing the current state.
	StopWallet() error
	// RescanBlockchain Rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself.
	// This includes destination addresses, tx secret keys, tx notes, etc.
	RescanBlockchain() error
	// SetTxNotes Set arbitrary string notes for transactions.
	SetTxNotes(req *SetTxNotesRequest) error
	// GetTxNotes Get string notes for transactions.
	GetTxNotes(req *GetTxNotesRequest) (*GetTxNotesResponse, error)
	// SetAttribute Set arbitrary attribute.
	SetAttribute(req *SetAttributeRequest) error
	// GetAttribute Get attribute value by name.
	GetAttribute(req *GetAttributeRequest) (*GetAttributeResponse, error)
	// GetTxKey Get transaction secret key from transaction id.
	GetTxKey(req *GetTxKeyRequest) (*GetTxKeyResponse, error)
	// CheckTxKey Check a transaction in the blockchain with its secret key.
	CheckTxKey(req *CheckTxKeyRequest) (*CheckTxKeyResponse, error)
	// GetTxProof Get transaction signature to prove it.
	GetTxProof(req *GetTxProofRequest) (*GetTxProofResponse, error)
	// CheckTxProof Prove a transaction by checking its signature.
	CheckTxProof(req *CheckTxProofRequest) (*CheckTxProofResponse, error)
	// GetSpendProof Generate a signature to prove a spend. Unlike proving a transaction, it does not requires the destination public address.
	GetSpendProof(req *GetSpendProofRequest) (*GetSpendProofResponse, error)
	// CheckSpendProof Prove a spend using a signature. Unlike proving a transaction, it does not requires the destination public address.
	CheckSpendProof(req *CheckSpendProofRequest) (*CheckSpendProofResponse, error)
	// GetReserveProof Generate a signature to prove of an available amount in a wallet.
	GetReserveProof(req *GetReserveProofRequest) (*GetReserveProofResponse, error)
	// CheckReserveProof Proves a wallet has a disposable reserve using a signature.
	CheckReserveProof(req *CheckReserveProofRequest) (*CheckReserveProofResponse, error)
	// GetTransfers Returns a list of transfers.
	GetTransfers(req *GetTransfersRequest) (*GetTransfersResponse, error)
	// GetTransferByTxid Show information about a transfer to/from this address.
	GetTransferByTxid(req *GetTransferByTxidRequest) (*GetTransferByTxidResponse, error)
	// DescribeTransfer Returns details for each transaction in an unsigned or multisig transaction set.
	DescribeTransfer(req *DescribeTransferRequest) (*DescribeTransferResponse, error)
	// Sign a string.
	Sign(req *SignRequest) (*SignResponse, error)
	// Verify a signature on a string.
	Verify(req *VerifyRequest) (*VerifyResponse, error)
	// ExportOutputs Export all outputs in hex format.
	ExportOutputs() error
	// ImportOutputs Import outputs in hex format.
	ImportOutputs(req *ImportOutputsRequest) (*ImportOutputsResponse, error)
	// ExportKeyImages Export a signed set of key images.
	ExportKeyImages() error
	// ImportKeyImages Import signed key images list and verify their spent status.
	ImportKeyImages(req *ImportKeyImagesRequest) (*ImportKeyImagesResponse, error)
	// MakeURI Create a payment URI using the official URI spec.
	MakeURI(req *MakeURIRequest) (*MakeURIResponse, error)
	// ParseURI Parse a payment URI to get payment information.
	ParseURI(req *ParseURIRequest) (*ParseURIResponse, error)
	// GetAddressBook Retrieves entries from the address book.
	GetAddressBook(req *GetAddressBookRequest) (*GetAddressBookResponse, error)
	// AddAddressBook Add an entry to the address book.
	AddAddressBook(req *AddAddressBookRequest) (*AddAddressBookResponse, error)
	// EditAddressBook Edit an existing address book entry.
	EditAddressBook(req *EditAddressBookRequest) error
	// DeleteAddressBook Delete an entry from the address book
	DeleteAddressBook(req *DeleteAddressBookRequest) error
	// Refresh a wallet after openning.
	Refresh(req *RefreshRequest) (*RefreshResponse, error)
	// AutoRefresh Set whether and how often to automatically refresh the current wallet.
	AutoRefresh(req *AutoRefreshRequest) error
	// RescanSpent Rescan the blockchain for spent outputs.
	RescanSpent() error
	// StartMining Start mining in the Monero daemon.
	StartMining(req *StartMiningRequest) error
	// StopMining Stop mining in the Monero daemon.
	StopMining() error
	// GetLanguages Get a list of available languages for your wallet's seed.
	GetLanguages() (*GetLanguagesResponse, error)
	// CreateWallet Create a new wallet. You need to have set the argument "–wallet-dir" when launching monero-wallet-rpc to make this work.
	CreateWallet(req *CreateWalletRequest) error
	// GenerateFromKeys Restores a wallet from a given wallet address, view key, and optional spend key.
	GenerateFromKeys(req *GenerateFromKeysRequest) (*GenerateFromKeysResponse, error)
	// OpenWallet Open a wallet. You need to have set the argument "–wallet-dir" when launching monero-wallet-rpc to make this work.
	OpenWallet(req *OpenWalletRequest) error
	// RestoreDeterministicWallet Create and open a wallet on the RPC server from an existing mnemonic phrase and close the currently open wallet.
	RestoreDeterministicWallet(req *RestoreDeterministicWalletRequest) (*RestoreDeterministicWalletResponse, error)
	// CloseWallet Close the currently opened wallet, after trying to save it.
	CloseWallet() error
	// ChangeWalletPassword Change a wallet password.
	ChangeWalletPassword(req *ChangeWalletPasswordRequest) error
	// IsMultisig Check if a wallet is a multisig one.
	IsMultisig() (*IsMultisigResponse, error)
	// PrepareMultisig Prepare a wallet for multisig by generating a multisig string to share with peers.
	PrepareMultisig() (*PrepareMultisigResponse, error)
	// MakeMultisig Make a wallet multisig by importing peers multisig string.
	MakeMultisig(req *MakeMultisigRequest) (*MakeMultisigResponse, error)
	// ExportMultisigInfo Export multisig info for other participants.
	ExportMultisigInfo() (*ExportMultisigInfoResponse, error)
	// ImportMultisigInfo Import multisig info from other participants.
	ImportMultisigInfo(req *ImportMultisigInfoRequest) (*ImportMultisigInfoResponse, error)
	// FinalizeMultisig Turn this wallet into a multisig wallet, extra step for N-1/N wallets.
	FinalizeMultisig(req *FinalizeMultisigRequest) (*FinalizeMultisigResponse, error)
	// SignMultisig Sign a transaction in multisig.
	SignMultisig(req *SignMultisigRequest) (*SignMultisigResponse, error)
	// SubmitMultisig Submit a signed multisig transaction.
	SubmitMultisig(req *SubmitMultisigRequest) (*SubmitMultisigResponse, error)
	// GetVersion Get RPC version Major & Minor integer-format, where Major is the first 16 bits and Minor the last 16 bits.
	GetVersion() (*GetVersionResponse, error)
}

Daemon example

package main

import (
	"fmt"

	"github.com/MarinX/monerorpc"
)

func main() {
	// create a new client for Testnet
	client := monerorpc.New(monerorpc.TestnetURI, nil)

	// if your monerod is protected, set username/password
	client.SetAuth("username", "password")

	// call RPC endpoint
	block, err := client.Daemon.GetBlockCount()
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Printf("Block count %d\n", block.Count)
}

Daemon methods

type Daemon interface {
	// GetBlockCount Look up how many blocks are in the longest chain known to the node.
	GetBlockCount() (*GetBlockCountResponse, error)
	// OnGetBlockHash Look up a block's hash by its height.
	OnGetBlockHash(req []uint64) (string, error)
	// GetBlockTemplate Get a block template on which mining a new block.
	GetBlockTemplate(req *GetBlockTemplateRequest) (*GetBlockTemplateResponse, error)
	// SubmitBlock Submit a mined block to the network.
	SubmitBlock(req []string) (*SubmitBlockResponse, error)
	// GetLastBlockHeader Block header information for the most recent block is easily retrieved with this method. No inputs are needed.
	GetLastBlockHeader() (*GetLastBlockHeaderResponse, error)
	// GetBlockHeaderByHash Block header information can be retrieved using either a block's hash or height.
	// This method includes a block's hash as an input parameter to retrieve basic information about the block.
	GetBlockHeaderByHash(req *GetBlockHeaderByHashRequest) (*GetBlockHeaderByHashResponse, error)
	// GetBlockHeaderByHeight Similar to get_block_header_by_hash above.
	// This method includes a block's height as an input parameter to retrieve basic information about the block.
	GetBlockHeaderByHeight(req *GetBlockHeaderByHeightRequest) (*GetBlockHeaderByHeightResponse, error)
	// GetBlockHeadersRange Similar to get_block_header_by_height above, but for a range of blocks.
	// This method includes a starting block height and an ending block height as parameters to retrieve basic information about the range of blocks.
	GetBlockHeadersRange(req *GetBlockHeadersRangeRequest) (*GetBlockHeadersRangeResponse, error)
	// GetBlock Full block information can be retrieved by either block height or hash, like with the above block header calls.
	// For full block information, both lookups use the same method, but with different input parameters.
	GetBlock(req *GetBlockRequest) (*GetBlockResponse, error)
	// GetConnections Retrieve information about incoming and outgoing connections to your node.
	GetConnections() (*GetConnectionsResponse, error)
	// GetInfo Retrieve general information about the state of your node and the network.
	GetInfo() (*GetInfoResponse, error)
	// HardForkInfo Look up information regarding hard fork voting and readiness.
	HardForkInfo() (*HardForkInfoResponse, error)
	// SetBans Ban another node by IP.
	SetBans(req *SetBansRequest) (*SetBansResponse, error)
	// GetBans Get list of banned IPs.
	GetBans() (*GetBansResponse, error)
	// FlushTxpool Flush tx ids from transaction pool
	FlushTxpool(req *FlushTxpoolRequest) (*FlushTxpoolResponse, error)
	// GetOutputHistogram Get a histogram of output amounts. For all amounts (possibly filtered by parameters), gives the number of outputs on the chain for that amount.
	// RingCT outputs counts as 0 amount.
	GetOutputHistogram(req *GetOutputHistogramRequest) (*GetOutputHistogramResponse, error)
	// GetVersion Give the node current version
	GetVersion() (*GetVersionResponse, error)
	// GetCoinbaseTxSum Get the coinbase amount and the fees amount for n last blocks starting at particular height
	GetCoinbaseTxSum(req *GetCoinbaseTxSumRequest) (*GetCoinbaseTxSumResponse, error)
	// GetFeeEstimate Gives an estimation on fees per byte.
	GetFeeEstimate(req *GetFeeEstimateRequest) (*GetFeeEstimateResponse, error)
	// GetAlternateChains Display alternative chains seen by the node.
	GetAlternateChains() (*GetAlternateChainsResponse, error)
	// RelayTx Relay a list of transaction IDs.
	RelayTx(req *RelayTxRequest) (*RelayTxResponse, error)
	// SyncInfo Get synchronisation informations
	SyncInfo() (*SyncInfoResponse, error)
	// GetTxpoolBacklog Get all transaction pool backlog
	GetTxpoolBacklog() (*GetTxpoolBacklogResponse, error)
	// GetOutputDistribution Alias: None.
	GetOutputDistribution(req *GetOutputDistributionRequest) (*GetOutputDistributionResponse, error)
}

Contributing

PR's are welcome. Please read CONTRIBUTING.md for more info

FAQ

There is a method missing, can I use this library?

Yes, client has a Do method which accepts any struct. Example:

package main

import (
	"fmt"

	"github.com/MarinX/monerorpc"
)

func main() {
	// create a new client for Testnet
	client := monerorpc.New(monerorpc.TestnetURI, nil)

	// if your monerod is protected, set username/password
	client.SetAuth("username", "password")

	// define request / response model
	var req struct{}
	var res struct{}

	// call RPC endpoint that is not documented
	err := client.Do("rpc_method_name", &req, &req)
	if err != nil {
		fmt.Println("error from RPC endpoint", err)
	}

}

I found a bug/issue

Please submit an issue on github or if you know how to fix it, PR's are welcome.

Version of the docs has changed, what now?

I will try to update the client as per docs changes. You are free to create an issue to notify me. I dont monitor monero docs 24/7 :)

Donate

48KX4E4MRryd5QsVuctroyF1CVHgtGB695BjDxmFTnf1M3r9zpbe86HTyeAJ5TegQAZPahFjitTrVQxUi1WVLjPFLWzvMec
Owner
Marin Basic
#gopher #remoteok
Marin Basic
Comments
  • Is the Status field in response structures meaningful?

    Is the Status field in response structures meaningful?

    I noticed that you kept the "Status" field in the response struct types. Is there any API function where the status can have something other than "OK" when no error value was returned?

    I realize that I'm asking a question as an issue, but I'm sure others will have the same question. Thanks!

  • autosave_current fields are not getting defaulted to true

    autosave_current fields are not getting defaulted to true

    These autosave_current fields are not getting defaulted to true as designed:

    https://github.com/MarinX/monerorpc/blob/v1.0.3/wallet/models.go#L1192-L1193 https://github.com/MarinX/monerorpc/blob/v1.0.3/wallet/models.go#L1226-L1227

    Right now the JSON requests are getting created with "autosave_current":false by default. The easiest fix would probably be to convert those boolean fields to *bool and add ,omitempty to the json tag.

  • Daemon GetInfo API can't deserialize responses

    Daemon GetInfo API can't deserialize responses

    The GetInfoResponse struct has a mistyped BusySyncing field. It should be bool, but it's typed string. https://github.com/MarinX/monerorpc/blob/master/daemon/models.go#L200-L201

    Here's test code snippet:

    endpoint := fmt.Sprintf("http://%s:%d/json_rpc", monerodHost, monerodPort)
    daemonCli := monerorpc.New(endpoint, nil).Daemon
    info, err := daemonCli.GetInfo()
    

    The last line above returns an error with the message:

    json: cannot unmarshal bool into Go struct field GetInfoResponse.busy_syncing of type string
    

    I'm using monerod release v0.18.1.1 with go1.18.5.

  • missing field named transfers in GetTransferByTxidResponse

    missing field named transfers in GetTransferByTxidResponse

    There's a missing array field named transfers in GetTransferByTxidResponse: https://github.com/MarinX/monerorpc/blob/v1.0.2/wallet/models.go#L903-L907

    Here is the documentation link: https://web.getmonero.org/resources/developer-guides/wallet-rpc.html#get_transfer_by_txid

    I don't personally need this field, so no urgency to get it fixed. If you are only sending to a single address with the transfer method, the array is useless, as its single element will be identical to the transfer field. That said, I just confirmed with monero release v0.18.1.2, that passing multiple addresses to the transfer method will yield multiple results in the transfers field of the get_transfer_by_txid response, so the field might be useful to someone.

  • daemon RPC API is missing generateblocks

    daemon RPC API is missing generateblocks

    generateblocks a niche API that is poorly documented, but the type of people using this library are typically running tests on their own code and need this method.

    Example:

    Start monerod in test mode:

    monerod --detach --regtest --offline --fixed-difficulty=1 --rpc-bind-ip 127.0.0.1 --rpc-bind-port 18081
    

    Request:

    curl http://127.0.0.1:18081/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"generateblocks","params":{
    "amount_of_blocks":1,
    "wallet_address":"42eTJxqsYwsSpFCRUp19vPAXNruqAUqnFMY2XN198643Ukrera958dY4qbRdoaoCVffhbC7ro4nzVBMw1E8ip7LAKG3SrsU"}' -H 'Content-Type: application/json'
    

    Response:

    {
      "id": "0",
      "jsonrpc": "2.0",
      "result": {
        "blocks": ["49b712db7760e3728586f8434ee8bc8d7b3d410dac6bb6e98bf5845c83b917e4"],
        "height": 9783,
        "status": "OK",
        "untrusted": false
      }
    }
    

    C++ reference: https://github.com/monero-project/monero/blob/v0.18.1.0/src/rpc/core_rpc_server_commands_defs.h#L1076-L1107

    The prev_block and starting_nonce are not important. I've never seen them documented anywhere, nor have I seen code that passed non-default values to those fields. Here's another point of reference: https://github.com/cirocosta/go-monero/blob/v0.0.5/pkg/rpc/daemon/jsonrpc.go#L153-L159

  • tagged release?

    tagged release?

    This looks like a nice library! Have you considered making a tagged release? Before the first release, it might be nice if you renamed the module to github.com/marinx/monerorpc (lower case to follow best practices).

  • IncomingTransfer doesn't return subaddr index

    IncomingTransfer doesn't return subaddr index

    Describe the bug When calling

    client.Wallet.IncomingTransfers(&incomingTransfersReq)

    the error is returned

    json: cannot unmarshal object into Go struct field IncomingTransfer.transfers.subaddr_index of type uint64

    To Reproduce Steps to reproduce the behavior: https://github.com/t-900-a/fider-monero-bot/blob/b85886d9e1bc26e95f10f35977d505bb64553e73/process-monero/main.go#L82

    Expected behavior A clear and concise description of what you expected to happen. subaddresses should be parsed correctly

    Go Version Please type your golang version 1.16.5

    Monerod Version Please type your monerod version 17.2.0

  • GetBlockCountResponse type missing field named Untrusted

    GetBlockCountResponse type missing field named Untrusted

    The GetBlockCountResponse type is missing a field named Untrusted: https://github.com/MarinX/monerorpc/blob/v1.0.4/daemon/models.go#L4-L7 https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_block_count

    $ curl -w "\n" http://127.0.0.1:18089/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_block_count"}' -H 'Content-Type: application/json'
    {
      "id": "0",
      "jsonrpc": "2.0",
      "result": {
        "count": 2745087,
        "status": "OK",
        "untrusted": false
      }
    }
    
  • GetBalanceResponse is missing fields

    GetBalanceResponse is missing fields

    Your definition: https://github.com/MarinX/monerorpc/blob/2691133659fad0bcccd18d3e3621de29e63f6503/wallet/models.go#L48-L57

    The 2 missing fields are:

          uint64_t   blocks_to_unlock;
          uint64_t   time_to_unlock;
    

    Reference: https://github.com/monero-project/monero/blob/v0.18.1.0/src/wallet/wallet_rpc_server_commands_defs.h#L108-L109

    Sample JSON capture returned by get_balance:

    {
        "balance": 17981101058456048,
        "blocks_to_unlock": 59,
        "multisig_import_needed": false,
        "per_subaddress": [{
          "account_index": 0,
          "address": "4Ae8FJHMJsnfsghVcg1u3SWqcLyUKCzNVMq8JLZCzgpSKCu6X2mEWZJXAqQpyJsQ11KVXgJDJ24LaBWCjYK8jQXU4NUpiJn",
          "address_index": 0,
          "balance": 17981101058456048,
          "blocks_to_unlock": 59,
          "label": "Primary account",
          "num_unspent_outputs": 512,
          "time_to_unlock": 0,
          "unlocked_balance": 15909955156562018
        }],
        "time_to_unlock": 0,
        "unlocked_balance": 15909955156562018
      }
    

    I opened an issue with the wallet RPC documentation too: https://github.com/monero-project/monero-site/issues/2022

Scp-wallet-api - Backend for SCP Wallet app

SCP Wallet API Backend for SCP Wallet app. It exposes a simplified REST API whic

Jan 31, 2022
Personal-Solana-Wallet - Create your personal wallet on Solana blockchain

Personal Wallet on Solana using Go ♾️ Setting up environment Installation of Cob

Nov 9, 2022
Monero: the secure, private, untraceable cryptocurrency
Monero: the secure, private, untraceable cryptocurrency

Monero Copyright (c) 2014-2021 The Monero Project. Portions Copyright (c) 2012-2013 The Cryptonote developers. Table of Contents Development resources

Jan 2, 2023
SwissWallet is a deterministic cryptocurrency wallet generator heavily based on MindWallet and MemWallet

SwissWallet SwissWallet is a deterministic cryptocurrency wallet generator heavily based on MindWallet and MemWallet but using argon2 and scrypt by de

Jul 28, 2022
Simple and useful principle of wallet in blockchain
Simple and useful principle of wallet in blockchain

Blockchain wallet utiles Development export GOPROXY=https://goproxy.io,direct go run *.go Build go build -o ./bin/app *.go About wallet in blockchain

Aug 11, 2022
A plugin that turn hashicorp vault into blockchain wallet.
A plugin that turn hashicorp vault into blockchain wallet.

dq-vault - Hashicorp vault BTC/ETH plugin This vault plugin stores a user's mnemonic inside vault in an encrypted manner. The plugin uses this stored

Dec 7, 2022
An easy to setup local crypto wallet based on Geth

CryptoWallet An easy to setup local crypto wallet based on Geth To run. go run CrytoWallet This will expose a set a api's. To Create new Wallet curl

Oct 15, 2021
A work-in-progress Bitcoin wallet based on Output Descriptors

go-wallet A work-in-progress Bitcoin wallet Descriptors go-wallet is designed around Bitcoin Descriptors. It implements a Output Script Descriptors la

May 4, 2022
API wrapper over high-load TON wallet

highload-wallet-api API wrapper over high-load TON wallet smart contract. Can be

Nov 4, 2022
Minilotus - A simple wallet manager of lotus

A simple wallet manager of lotus. Refer to https://github.com/filecoin-project/l

Jan 5, 2022
A simple ticket-wallet API. It is fully dockerized

Ticket Wallet This is a simple ticket-wallet API. It is fully dockerized. Table of contents 1 Response Data format 2 API  2.1 Get layout  2.2 Start se

Jan 23, 2022
Feb 14, 2022
A project that addresses the creation of RPC (Server-Client) and execute a CRUD in database

RPC - Server/Client A project that addresses the creation of RPC (Server-Client)

Dec 24, 2021
A full node Bitcoin (BSV) implementation written in Go

bsvd bsvd is a full node Bitcoin (BSV) implementation written in Go (golang). This project is a port of the bchd codebase to Bitcoin (BSV). It provide

Dec 25, 2022
Full bitcoin solution written in Go (golang)
Full bitcoin solution written in Go (golang)

About Gocoin Gocoin is a full Bitcoin solution written in Go language (golang). The software architecture is focused on maximum performance of the nod

Dec 20, 2022
Openbazaar-go - OpenBazaar Server Daemon in Go
Openbazaar-go - OpenBazaar Server Daemon in Go

openbazaar-go OpenBazaar Server Daemon in Go This repository contains the OpenBa

Feb 15, 2022
Tool for monitoring your Ethereum clients. Client-agnostic as it queries the standardized JSON-RPC APIs
Tool for monitoring your Ethereum clients. Client-agnostic as it queries the standardized JSON-RPC APIs

e7mon Tool for monitoring your Ethereum clients. Client-agnostic as it queries the standardized JSON-RPC APIs. However, the execution client should be

Dec 20, 2022
collection of tools to gleam insights from a full bitclout node's data
collection of tools to gleam insights from a full bitclout node's data

bitcloutscripts collection of tools to gleam insights from a full bitclout node's data bitcloutscripts $ ./bcs bcs posts # print all posts

Jul 11, 2021