qorechain (Rust)
Rust SDK for QoreChain — network presets, denomination/address utilities, HD
account derivation (native / EVM / SVM), post-quantum (ML-DSA-87) signing, typed
messages for every custom chain module, the full transaction lifecycle (auto-gas,
error decoding, tracking, search), typed queries, WebSocket subscriptions, and
async read clients for the REST (LCD) and qor_* JSON-RPC surfaces.
This crate lives in the qorechain-sdk monorepo and mirrors the TypeScript,
Python, and Go SDK surfaces for the native chain.
Install
[]
= "0.2"
= { = "1", = ["macros", "rt-multi-thread"] }
Requires Rust 1.74+.
Modules
| Module | Purpose |
|---|---|
networks |
Network presets (testnet and mainnet, both live), get_network. |
denom |
to_base / from_base exact integer money math (no floats). |
address |
bech32 ⇄ hex conversion and validation. |
accounts |
BIP-39 mnemonics + HD derivation (native, EVM, SVM). |
pqc |
ML-DSA-87 (FIPS 204) keygen / sign / verify + hybrid extension. |
proto |
Generated prost types for every QoreChain custom module. |
msg |
Typed message composers (49 custom + standard Cosmos) and to_any. |
query |
RestClient, JsonRpcClient, typed qor_* QorClient, and TypedQueryClient. |
client |
create_client / ClientBuilder composing the read clients + fees. |
tx |
bank_send, send_messages, build_hybrid_tx, broadcast, auto-gas, error decoding, tracking, and search. |
subscribe |
WebSocket new-block / tx subscriptions over the chain RPC /websocket. |
utils |
Hashing (sha256/keccak256/ripemd160), exact unit math, EVM/SVM address validators. |
Typed messages and composers
Every QoreChain custom-module message (49 across amm, bridge, rdk, multilayer,
pqc, svm, lightnode, license, abstractaccount, crossvm, rlconsensus) plus the
common standard Cosmos messages have typed composers under msg. Each returns a
prost message; the *_any variants pack it into a cosmrs::Any with the correct
type URL, ready for tx::send_messages or tx::build_hybrid_tx:
use msg;
use Coin;
let any = swap_exact_in_any;
assert_eq!;
The prost types are generated offline by scripts/codegen-rust.sh (buf +
protoc-gen-prost) and committed under src/proto, so cargo build needs no
protoc. Type URLs use the exact on-chain message names (e.g.
MsgRegisterPQCKey), which is what the chain's interface registry resolves.
Out of scope
Browser wallet adapters and EVM/SVM transaction adapters are intentionally not
bundled — Rust dApps use ethers-rs/alloy (EVM) and the Solana SDK (SVM)
directly. The ICS-20 IBC MsgTransfer is not bundled either (the underlying
proto crate omits IBC types); build it with ibc-proto and pack it via
msg::to_any using msg::cosmos::MSG_TRANSFER.
Quickstart
Create a client
use ClientBuilder;
async
Mainnet (chain id qorechain-vladi) is live; select it and override the
localhost defaults with your node URLs:
use ClientBuilder;
let client = new
.network
.rest
.evm_rpc
.build
.unwrap;
// client.network.chain_id == Some("qorechain-vladi".into())
Derive accounts
use ;
let mnemonic = generate_mnemonic.unwrap;
let native = derive_native_account.unwrap; // qor1...
let evm = derive_evm_account.unwrap; // 0x... (EIP-55)
let svm = derive_svm_account.unwrap; // base58 ed25519
Derivation paths: native m/44'/118'/0'/0/{i}, EVM m/44'/60'/0'/0/{i},
SVM m/44'/501'/{i}'/0'. Invalid mnemonics (wrong checksum) return an error.
Post-quantum signing
use ;
let kp = generate_pqc_keypair.unwrap; // ML-DSA-87: 2592 / 4896
let sig = pqc_sign.unwrap; // 4627-byte signature
assert!;
let ext =
build_hybrid_signature_extension.unwrap;
// serializes to {"algorithm_id":1,"pqc_signature":"<base64>","pqc_public_key":"<base64>"}
let _ = ext;
Denomination math
use ;
assert_eq!;
assert_eq!;
All amount math is exact integer arithmetic on decimal strings — never floating point — so conversions never drift for any magnitude.
Transactions
The tx module builds, signs, and broadcasts native transactions, and provides
end-to-end hybrid (classical secp256k1 + post-quantum ML-DSA-87) signing:
bank_sendbuilds and signs acosmos.bank.v1beta1.MsgSendinto a broadcast-readyTxRaw(SIGN_MODE_DIRECT).broadcastPOSTs signed bytes to the REST/cosmos/tx/v1beta1/txsendpoint (sync/async/block).fee_from_estimateturns an AI fee-oracle response into aFee.build_hybrid_txproduces a tx carrying the classical signature inTxRaw.signaturesPLUS an ML-DSA-87 signature in theTxBodyPQCHybridSignatureextension. The PQC half signsBE32(len(B0)) || B0 || BE32(len(A)) || A(body without the extension, then authInfo); the classical half signs the final body. The signer's PQC key must be registered on-chain (MsgRegisterPQCKey) — or passinclude_pqc_public_keyto embed it for auto-registration.
Transaction proto encoding/signing is delegated to the cosmrs crate; no
proto/crypto primitives are reimplemented here.
Generic messages, auto-gas, tracking, and search
use ;
use Coin;
# async
Typed queries
TypedQueryClient runs the modules' gRPC Query services over the chain RPC
abci_query transport (no gRPC dependency) and returns the strongly typed prost
responses:
use TypedQueryClient;
# async
WebSocket subscriptions
use SubscribeClient;
# async
Development
Regenerate the committed prost types (maintainer only; needs buf and
protoc-gen-prost):