Official SDK ecosystem for the Notareum Protocol — decentralized resource verification on-chain.
| SDK | Package | Language | Status |
|---|---|---|---|
| notareum-ts-sdk | @notareum/sdk (npm) |
TypeScript | Active |
| notareum-py-sdk | notareum (PyPI) |
Python ≥ 3.10 | Active |
| notareum-rs-sdk | notareum-sdk (crates.io) |
Rust | Active |
All three SDKs expose the same surface area across the Notareum protocol:
.notafile builder, signer, parser, and verifier- Resource registry (
registerResource, quorum queries, status) - Verification engine (request, fulfill, validator attestation)
- Validator staking (stake, unstake, rewards, slashing)
- Governance via veNOTA (lock, vote, delegate)
- Fee manager and access manager helpers
import { Notareum } from "@notareum/sdk";
const ntm = Notareum({
provider, // ethers v6 Provider
signer, // ethers v6 Signer (optional, needed for write ops)
contracts: {
notaToken: "0x...",
veNota: "0x...",
validatorStaking: "0x...",
notaRegistry: "0x...",
verificationEngine: "0x...",
slashingManager: "0x...",
feeManager: "0x...",
accessManager: "0x...",
},
});
const nota = await ntm.nota
.create({ type: "address", chainId: 1, chainName: "ethereum", identifier: "0x..." })
.sign(signer);
await ntm.registry.registerResource(0, 1n, "0x...", "0x" + "00".repeat(32));
await ntm.verification.request(resourceId, 0); // 0 = BASIC
await ntm.staking.stake(10_000n * 10n ** 18n);
await ntm.governance.lock(1_000n * 10n ** 18n, 365n * 24n * 3600n);See notareum-ts-sdk/ for full documentation.
from notareum import Notareum
ntm = Notareum(
provider=w3, # web3.py Web3 instance
account=account, # eth_account LocalAccount (for write ops)
contracts={
"nota_token": "0x...",
"ve_nota": "0x...",
"validator_staking": "0x...",
"nota_registry": "0x...",
"verification_engine": "0x...",
"slashing_manager": "0x...",
"fee_manager": "0x...",
"access_manager": "0x...",
},
)
nota = ntm.nota.create(
type="address", chain_id=1, chain_name="ethereum", identifier="0x..."
).sign(account)
ntm.registry.register_resource(0, 1, "0x...", b"\x00" * 32)
ntm.verification.request(resource_id, 0)
ntm.staking.stake(10_000 * 10**18)See notareum-py-sdk/ for full documentation.
use notareum_sdk::{Notareum, Contracts};
let ntm = Notareum::new(provider, signer, Contracts {
nota_token: "0x...".parse()?,
ve_nota: "0x...".parse()?,
validator_staking: "0x...".parse()?,
nota_registry: "0x...".parse()?,
verification_engine: "0x...".parse()?,
slashing_manager: "0x...".parse()?,
fee_manager: "0x...".parse()?,
access_manager: "0x...".parse()?,
})?;
ntm.registry().register_resource(0, 1u64.into(), addr, [0u8; 32]).await?;
ntm.verification().request(resource_id, 0).await?;
ntm.staking().stake(U256::from(10_000u64) * U256::exp10(18)).await?;See notareum-rs-sdk/ for full documentation.
Each language SDK is a standalone repository maintained under the notareum GitHub org. This umbrella repository links them as git submodules for cross-language browsing and coordinated releases.
Shared design principles across SDKs:
- Parity. Every SDK implements the same client modules (
nota,registry,verification,staking,governance,fee). - ABI-driven. Contract bindings are generated from the canonical ABIs in each SDK's
abi/directory. - Deterministic
.notafiles. Hashing, signing, and serialization are bit-for-bit compatible across TypeScript, Python, and Rust.
MIT. See individual SDK repositories for details.