Onchain
Shared Ethereum/blockchain library for Elixir. Provides read (eth_call) and write (transaction signing) capabilities using signet as the sole Ethereum dependency.
Installation
Add onchain to your list of dependencies in mix.exs:
def deps do
[
{:onchain, "~> 0.3"}
]
endRequires an Ethereum JSON-RPC endpoint. Configure via:
# config/config.exs
config :signet, :rpc_url, "https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY"
Or pass the URL per-call to Onchain.RPC functions.
Modules
Core
| Module | Purpose |
|---|---|
Onchain.Hex | Hex encoding/decoding (hex<->binary, hex<->integer, 0x prefix) |
Onchain.ABI | ABI encoding/decoding for contract calls |
Onchain.Address | Address validation, EIP-55 checksum, normalization |
Onchain.Decimal | Decimal precision helpers (to_decimal, div_pow10, to_basis_points) |
Onchain.RPC | Ethereum JSON-RPC wrapper (eth_call, eth_getLogs, receipts, nonces, balances) |
Onchain.RPC.Helpers | Shared RPC helper functions (hex normalization, block tags, tx hash validation) |
Onchain.Block | Block fetching with parsed fields, timestamp-based binary search |
Onchain.Contract | Generic contract call (encode -> eth_call -> decode in one function) |
Onchain.Multicall | Batch multiple eth_call via Multicall3 |
Onchain.Log | Event log parsing against ABI signatures |
Onchain.Signer | Key management and transaction signing |
Onchain.ERC20 | ERC-20 read (balanceOf, allowance) and write (transfer, approve) |
Chain Intelligence
| Module | Purpose |
|---|---|
Onchain.Wallet | Classify address (EOA/contract), native ETH balance |
Onchain.Transfer | Parse ERC-20/721/1155 Transfer events into normalized structs |
Onchain.ENS | ENS name resolution (forward, reverse, text records, contenthash) |
Contract Codegen
| Module | Purpose |
|---|---|
Onchain.Solidity | Rustler NIF: Alloy-powered Solidity ABI parser |
Onchain.Contract.Generator |
Macro: .sol file -> typed Elixir module at compile time |
Local EVM Simulation
| Module | Purpose |
|---|---|
Onchain.EVM | Rustler NIF: revm local EVM execution (fork mainnet, simulate transactions) |
Onchain.Trace | Debug/trace APIs (trace_transaction, trace_call, storage_at) |
Aave v3
| Module | Purpose |
|---|---|
Onchain.Aave.Pool | Pool read + write calls (getUserAccountData, supply, borrow, repay) |
Onchain.Aave.Oracle | Asset price oracle + Chainlink |
Onchain.Aave.Math | USD conversion, LTV, health factor, ray math |
Onchain.Aave.Contracts | Verified address registry (mainnet + multi-chain) |
Onchain.Aave.UIPoolDataProvider | Reserves and user reserves data |
Onchain.Aave.Faucet | Testnet faucet interactions (mint test tokens) |
Discovery
All modules use descripex for self-describing APIs:
Onchain.describe() # Module overview
Onchain.describe(:hex) # Function list
Onchain.describe(:hex, :decode) # Full function detailsTesting
mix test.json --quiet # Unit tests (no RPC needed)
mix test.json --quiet --include integration # Integration tests (requires RPC)Integration tests require an Ethereum RPC endpoint:
export ETHEREUM_API_URL="https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY"
Sepolia write tests additionally require SIGNER_PRIVATE_KEY.