Skip to content

qntx/signer

Signer

Crates.io Docs.rs CI License Rust

Modular, no_std-compatible Rust toolkit for multi-chain transaction signing — 9 chains, zero hand-written cryptography.

Signer provides thin, secure wrappers around battle-tested cryptographic libraries (k256 for secp256k1, ed25519-dalek for Ed25519), exposing a unified Sign trait across Bitcoin, Ethereum, Solana, Cosmos, Tron, Sui, TON, Filecoin, and Spark. All library crates compile under no_std + alloc and zeroize sensitive material on drop.

Signer CLI Demo

Quick Start

Install the CLI

Shell (macOS / Linux):

curl -fsSL https://sh.qntx.fun/signer | sh

PowerShell (Windows):

irm https://sh.qntx.fun/signer/ps | iex

Or via Cargo:

cargo install signer-cli

CLI Usage

# Ethereum — EIP-191 personal_sign
signer evm sign-message -k "0x4c0883a6..." -m "Hello, Ethereum!"

# Bitcoin — message signing
signer btc sign-message -k "4c0883a6..." -m "Hello, Bitcoin!"

# Solana — Ed25519
signer svm sign -k "9d61b19d..." -m "Hello, Solana!"

# Sui — BLAKE2b intent signing
signer sui sign-tx -k "9d61b19d..." -t "0000..."

# Show address / public key
signer evm address -k "0x4c0883a6..."

# JSON output (for scripts / agents)
signer --json evm sign-message -k "0x4c0883a6..." -m "test"

Library Usage

use signer_evm::Signer;

let signer = Signer::from_hex("4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318")?;
let out = signer.sign_message(b"hello")?;

println!("Address:   {}", signer.address());
println!("Signature: {}", hex::encode(&out.signature));
use signer_svm::Signer;
use ed25519_dalek::Signer as _;

let signer = Signer::random();
let sig = signer.sign(b"hello solana");
signer.verify(b"hello solana", &sig)?;

println!("Address: {}", signer.address());

Kobe HD Wallet Integration

Enable the kobe feature to construct signers from kobe derived keys:

use kobe::Wallet;
use kobe_evm::Deriver;
use signer_evm::Signer;

let wallet = Wallet::from_mnemonic("abandon abandon ... about", None)?;
let derived = Deriver::new(&wallet).derive(0)?;
let signer = Signer::from_derived(&derived)?;
println!("Address: {}", signer.address());

Design

  • 9 chains — Ethereum, Bitcoin, Solana, Cosmos, Tron, Sui, TON, Filecoin, Spark
  • Zero hand-rolled crypto — secp256k1 via k256, Ed25519 via ed25519-dalek
  • Unified traitSign trait with sign_hash, sign_message, sign_transaction across all chains
  • no_std + alloc — All library crates compile without std; embedded / WASM ready
  • Security hardenedZeroizeOnDrop, Debug redacted ([REDACTED]), Clone removed, Send + Sync
  • Kobe integration — Optional HD wallet bridging via kobe feature flag
  • CSPRNG — Random generation via OS-provided entropy (getrandom)
  • KAT-verified — Deterministic test vectors (RFC 8032, known secp256k1 keys) for all chains
  • Strict linting — Clippy pedantic + nursery + correctness (deny), zero warnings

Crates

See crates/README.md for the full crate table, dependency graph, and feature flag reference.

Security

This library has not been independently audited. Use at your own risk.

  • Private keys wrapped in ZeroizeOnDrop — zeroed from memory on drop
  • Debug impl outputs [REDACTED] — no key material leaked to logs
  • Clone intentionally removed — prevents uncontrolled key copies
  • Random generation uses OS-provided CSPRNG via getrandom
  • Sign trait requires Send + Sync — safe for concurrent use
  • No key material is logged or persisted

License

Licensed under either of:

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project shall be dual-licensed as above, without any additional terms or conditions.


A QNTX open-source project.

QNTX

Code is law. We write both.

About

A lightweight, no_std multi-chain cryptographic signer in Rust.

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Contributors