7 stable releases

2.1.1 Jan 13, 2020
2.1.0 Dec 12, 2019
2.0.2 Dec 12, 2019
1.0.2 May 27, 2019
1.0.1 Mar 25, 2019

#7 in #block-height

43 downloads per month


2.5K SLoC

Factom Rust API Client

Crates.io Released API docs Build Status dependency status Discord License


Add to cargo.toml:

factom = "^2"


use factom::*;
// Get current block height from open node
async fn main() {
  //Create a re-usable client
  let client = Factom::open_node();
  // Call the heights function, handle the request result
  let response = factomd::heights(&client).await.expect("Network Request");
  assert!(response.result.leaderheight > 0);


See the examples folder for common workflows, or use cargo run --example to view all those you can run.

// Default settings
// factomd: http://localhost:8088
// factom-walletd: http://localhost:8089
let client = Factom::new();

// Using open node
// factomd: https://api.factomd.net/v2
let client = Factom::open_node();

// Using the tesnet open node
// factomd: https://dev.factomd.net/v2
let client = Factom::testnet_node();

// Using custom node locations
let factomd = "https://api.factomd.net/";
let factom_walletd = "";
let client = Factom::custom_node(factomd, factom_walletd)
Retrieve a Balance
let client = factom::testnet_node();
let testnet_address = "FA2jK2HcLnRdS94dEcU27rF3meoJfpUcZPSinpb7AwQvPRY6RL1Q";
let response = balance::factoid_balance(&client, testnet_address).await.unwrap();
// factoid balance returns factoshis, convert
let factoids = utils::factoshis_to_fct(response.result.balance);
println!("The testnet balance of {} is {} factoids", FCT_PUB, factoids);
Get Entry Data
let client = factom::testnet_node();
let hash = "97c4e7adce9ed277b62adfb9fb7a31ca4778181e49dcdfebca967102dd424fbc";
let response = entry::entry(hash).await.unwrap();
Traverse a Chain
 let client = Factom::open_node();
 let chain = "843dbee7a49a9b9510d399759fbce24b1f700268c94508085abce352d70ed1f6";
 // traverse_chain is a utility that returns Vec<Entry>, the number of blocks to
 // parse can be specified, to traverse the entire chain use a depth of 0, here 
 // only 1 block,the chainhead itself, will be retrieved.
 let response = utils::traverse_chain(&client, chain, 1).await;


This library re-exports the tokio runtime and executor by default, to disable this and use a different runtime modify your cargo.toml with a feature flag:

factom = {version="^2", default-features=false}


Most of the functions are covered by the test modules along with all the documentation examples. Beware that running cargo test with nocapture will produce a huge amount of output. For many of the tests to pass you will need to be running factom-walletd, any test transactions or addresses are cleaned up afterward.

See the tests readme for instructions.


A criterion benching harness is provided, if gnuplot is installed it will also automatically generate plots for any benchmarks run, they can be found at <LIBRARY>/target/criterion/report/index.html. This can be used to test the performance of factomd, factom-walletd, network connections and the library functions themselves.


A fuzzing suite is provided using the rust implementation of American Fuzzy Lop, with appropriate setup this can be used to fuzz both the Factom rust library along with a simulated Factom network and factom-walletd. See the fuzz folder readme for more information.


PR's welcome. Fork the library and submit to dev branch. By contributing to this library you agree to it being Apache 2.0 licensed


~347K SLoC