61 releases (8 stable)

new 1.4.0 Apr 10, 2024
1.3.0 Oct 23, 2023
1.2.3 Jul 1, 2023
0.7.0 Feb 7, 2023
0.1.14 Nov 28, 2018

#708 in Magic Beans

Download history 84/week @ 2023-12-22 53/week @ 2023-12-29 141/week @ 2024-01-05 152/week @ 2024-01-12 126/week @ 2024-01-19 130/week @ 2024-01-26 184/week @ 2024-02-02 91/week @ 2024-02-09 406/week @ 2024-02-16 556/week @ 2024-02-23 507/week @ 2024-03-01 838/week @ 2024-03-08 520/week @ 2024-03-15 317/week @ 2024-03-22 288/week @ 2024-03-29 344/week @ 2024-04-05

1,672 downloads per month
Used in 14 crates (13 directly)

Apache-2.0

165KB
3.5K SLoC

Introduction

Clarity is a low-level Ethereum transaction library written in pure Rust.

Features

  • Any-endian, 32/64-bit support
  • Public/private key handling
  • Transaction signing and verification
  • ABI enconding for common data types (see abi::Token variants)

Getting started

Here's an example lifetime of an Alice-to-Bob Ethereum transaction made with Clarity:

extern crate clarity;
use web30::client::Web3;

use clarity::{Address, Signature, Transaction, PrivateKey};
use std::time::Duration;


// A helper for filling the keys
let mut key_buf: [u8; 32] = rand::random();

let alices_key = PrivateKey::from_bytes(key_buf).unwrap();

key_buf = rand::random();
let bobs_key = PrivateKey::from_bytes(key_buf).unwrap();

// Create a new transaction
let tx = Transaction::Legacy {
    nonce: 0u32.into(),
    gas_price: 1_000_000_000u32.into(),
    gas_limit: 21_000u32.into(),
    to: bobs_key.to_address(),
    value: 100u32.into(),
    data: Vec::new(),
    signature: None, // Not signed. Yet.
};

let tx_signed: Transaction = tx.sign(&alices_key, None);
assert!(tx_signed.is_valid());

// You can always derive the sender from a signed transaction
let sender: Address = tx_signed.sender().unwrap();

// Send the locally assembled raw transaction over web3 (no need to trust another
// machine with your wallet or host a node locally).
const TIMEOUT: Duration = Duration::from_secs(1);
let web3 = Web3::new("http://localhost:8545", TIMEOUT);
let res = web3
    .eth_send_raw_transaction(tx_signed.to_bytes());
// res.await.unwrap()

Dependencies

~8MB
~94K SLoC