Loading...
Loading...
Use boha as a Rust library for crypto puzzle and bounty data. Trigger when code imports `boha`, references Bitcoin puzzle transactions, hash collision bounties, or needs programmatic access to crypto challenge collections. Do not use for CLI usage - see boha-cli skill instead.
npx skill4agent add oritwoen/boha boha&'static[dependencies]
boha = "0.16"
# With async balance fetching (requires tokio runtime)
boha = { version = "0.16", features = ["balance"] }
tokio = { version = "1", features = ["full"] }collection/identifier| Collection | ID example | Notes |
|---|---|---|
| b1000 | | Number 1-256, accepts u32/usize/&str |
| arweave | | Name string |
| ballet | | Serial number |
| bitaps | | Single puzzle, no slash |
| bitimage | | Name string |
| gsmg | | Single puzzle, no slash |
| hash_collision | | sha1, sha256, ripemd160, hash160, hash256, op_abs |
| zden | | snake_case level names |
use boha::{b1000, hash_collision, zden, Status, Chain};
// Fetch by collection-specific getter
let p = b1000::get(66).unwrap();
println!("{} - {}", p.address.value, p.status);
// Fetch by universal ID
let p = boha::get("hash_collision/sha256").unwrap();
// Iterate and filter
let targets: Vec<_> = b1000::all()
.filter(|p| p.status == Status::Unsolved)
.filter(|p| p.pubkey.is_some())
.collect();
// Key range (b1000 only) - puzzle N has key in [2^(N-1), 2^N-1]
let range = b1000::get(90).unwrap().key_range().unwrap();
// Big key range for bits > 128
let (lo, hi) = b1000::get(200).unwrap().key_range_big().unwrap();
// Stats
let s = boha::stats();
println!("Total: {}, Unsolved: {}", s.total, s.unsolved);
// Explorer URLs
let url = p.chain.tx_explorer_url("txid_here");
let addr_url = p.explorer_url();balanceuse boha::balance;
#[tokio::main]
async fn main() {
let bal = balance::fetch("1A1zP1...", boha::Chain::Bitcoin).await.unwrap();
println!("{} sats confirmed, {:.8} BTC total", bal.confirmed, bal.total_btc());
}PuzzleAddressKeyChainStatusAuthorSolverTransaction&'statickey_range()key_range_big()balancedata/*.jsonc