9 releases (5 breaking)

0.14.0 Jul 4, 2024
0.13.0 Jul 24, 2023
0.12.1 Jun 23, 2023
0.12.0 Mar 19, 2023
0.10.0 Nov 21, 2021

#6 in #monero

MIT/Apache

275KB
6K SLoC

Rust 4K SLoC // 0.0% comments JavaScript 1.5K SLoC // 0.1% comments

BuildStatus Crates.io Documentation MSRV

AcceptXMR: Accept Monero in Your Application

AcceptXMR is a library for building payment gateways.

For a batteries-included gateway, please see AcceptXMR-Server.

Getting Started

To use AcceptXMR in your rust project, first add it to your Cargo.toml. For example if you intend to use the Sqlite storage backend and need serde support, you should add this to your Cargo.toml:

[dependencies]
acceptxmr = { version = "0.12", features = ["serde", "sqlite"] }

You can then create and run a PaymentGateway:

use acceptxmr::{PaymentGateway, storage::stores::Sqlite};
use std::time::Duration;

let private_view_key = 
  "ad2093a5705b9f33e6f0f0c1bc1f5f639c756cdfc168c8f2ac6127ccbdab3a03";
let primary_address = 
  "4613YiHLM6JMH4zejMB2zJY5TwQCxL8p65ufw8kBP5yxX9itmuGLqp1dS4tkVoTxjyH3aYhYNrtGHbQzJQP5bFus3KHVdmf";

let store = Sqlite::new("AcceptXMR_DB", "invoices")?;

let payment_gateway = PaymentGateway::builder(
  private_view_key.to_string(),
  primary_address.to_string(),
  store
)
.daemon_url("https://node.example.com") // Specify a node.
.scan_interval(Duration::from_millis(500)) // Scan for updates every 500 ms.
.build()?;

payment_gateway.run()?;

Finally, you can create invoices and subscribe to them so you know when they get paid:

// Oh hey, a customer is checking out!
let invoice_id = payment_gateway.new_invoice(
  100 * 10 ** 9,                    // We'll charge 100 millineros,
  0,                                // require 0 confirmations,
  10,                               // expire in 10 blocks,
  "Large Cheese Pizza".to_string()  // and get the order right.
).await?;

// We can now subscribe to updates to the pizza invoice.
let subscriber = payment_gateway.subscribe(invoice_id)?
  .expect("invoice doesn't exist");

// Have we been paid yet?
let update = subscriber.recv().await.expect("channel closed");

if update.is_confirmed() {
  // Great, ship the pizza and stop tracking the invoice.
  println!("Invoice for \"{}\" paid", update.description());
  payment_gateway.remove_invoice(invoice_id).await?;
}   

For more detailed documentation, see docs.rs or the examples.

Dependencies

~21–33MB
~609K SLoC