gleeth

Package Version Hex Docs

An Ethereum library for Gleam, targeting the Erlang (BEAM) runtime. Provides JSON-RPC client, transaction signing, ABI encoding/decoding, and wallet management.

Warning: gleeth has not been audited and is in early development. It is recommended for testnet and development use only. Do not use with real funds in production without thorough independent review.

Installation

gleam add gleeth

Quick start

Read chain state

import gleeth/provider
import gleeth/rpc/methods

pub fn main() {
  let assert Ok(p) = provider.new("http://localhost:8545")

  // Get the latest block number
  let assert Ok(block_number) = methods.get_block_number(p)

  // Check an address balance
  let assert Ok(balance) = methods.get_balance(
    p,
    "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  )
}

Sign and send a transaction

All numeric values (wei amounts, gas, nonce) use 0x-prefixed hex strings, matching the Ethereum JSON-RPC format. Values returned by methods.get_gas_price, methods.get_transaction_count, etc. can be passed directly to transaction builders.

import gleeth/crypto/transaction
import gleeth/crypto/wallet
import gleeth/provider
import gleeth/rpc/methods

pub fn main() {
  let assert Ok(p) = provider.new("http://localhost:8545")
  let assert Ok(w) = wallet.from_private_key_hex("0xac09...")

  let sender = wallet.get_address(w)

  // These return hex strings that can be passed directly to create_legacy_transaction
  let assert Ok(nonce) = methods.get_transaction_count(p, sender, "pending")
  let assert Ok(gas_price) = methods.get_gas_price(p)

  let assert Ok(tx) = transaction.create_legacy_transaction(
    "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
    "0xde0b6b3a7640000",  // 1 ETH = 1e18 wei in hex
    "0x5208",              // 21000 gas in hex
    gas_price,             // from RPC, already hex
    nonce,                 // from RPC, already hex
    "0x",                  // no calldata
    1,                     // mainnet chain ID (integer, not hex)
  )

  let assert Ok(signed) = transaction.sign_transaction(tx, w)
  let assert Ok(tx_hash) = methods.send_raw_transaction(p, signed.raw_transaction)
}

Call a contract

import gleeth/provider
import gleeth/rpc/methods

pub fn main() {
  let assert Ok(p) = provider.new("http://localhost:8545")

  // Call balanceOf(address) on an ERC-20
  let assert Ok(result) = methods.call_contract(
    p,
    "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",  // USDC
    "0x70a08231000000000000000000000000d8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  )
}

ABI encoding

import gleeth/ethereum/abi/encode
import gleeth/ethereum/abi/types.{Uint, Address, AbiUintValue, AbiAddressValue}

pub fn main() {
  // Encode a function call: transfer(address, uint256)
  let assert Ok(calldata) = encode.encode_call(
    "transfer(address,uint256)",
    [Uint(256), Address],
    [
      AbiAddressValue("0x70997970C51812dc3A010C7d01b50e0d17dc79C8"),
      AbiUintValue(1000000),
    ],
  )
}

Features

Requirements

Run mix local.hex --force before first build if Elixir is freshly installed.

CLI

Gleeth also includes a CLI for quick Ethereum queries:

gleam run -- block-number --rpc-url http://localhost:8545
gleam run -- balance 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --rpc-url http://localhost:8545
gleam run -- send --to 0x... --value 0xde0b6b3a7640000 --private-key 0x... --rpc-url http://localhost:8545

Set GLEETH_RPC_URL to avoid passing --rpc-url every time.

Development

gleam build          # Compile
gleam test           # Run all 285 tests
gleam format         # Format code
gleam docs build     # Generate documentation

Further documentation can be found at https://hexdocs.pm/gleeth.

Search Document