Ox (⦻) is the foundation of robust Ethereum software written in TypeScript. It is an Ethereum Standard Library that provides a set of lightweight, performant, and type-safe TypeScript modules for Ethereum.
It offers core utilities & types for primitives such as: ABIs, Addresses, Blocks, Bytes, ECDSA, Hex, JSON-RPC, RLP, Signing & Signatures, Transaction Envelopes, and more.
As an unopinionated Standard Library, it is designed to be used by higher-level consumers (such as Viem, Tevm, or their alternatives) to provide their own opinionated interfaces, and/or when reaching for low-level primitives may be needed without buying into a Client Abstraction stack (Viem, Ethers, Web3.js, etc).
Head to the documentation to read and learn more about Ox.
The example below demonstrates how to construct, sign, and broadcast a transaction envelope using Ox:
import{Provider,Secp256k1,TxEnvelopeEip1559,Value}from'ox'// 1. Construct a transaction envelope.constenvelope=TxEnvelopeEip1559.from({chainId: 1,gas: 21000n,nonce: 0n,maxFeePerGas: Value.fromGwei('10'),maxPriorityFeePerGas: Value.fromGwei('1'),to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',value: Value.fromEther('1'),})// 2. Get the signing payload for the envelope.constpayload=TxEnvelopeEip1559.getSignPayload(envelope)// 3. Sign the payload with your private key using secp256k1.constsignature=Secp256k1.sign({ payload,privateKey: '0x...'})// 4. Serialize the envelope with the signature.constserialized=TxEnvelopeEip1559.serialize(envelope,{ signature })// 5. Broadcast the envelope to the network.constprovider=Provider.from(window.ethereum)consthash=awaitprovider.request({method: 'eth_sendRawTransaction',params: [serialized],})Note
Ox's APIs are purposely stateless, unopinionated, and verbose. The example above can definitely be achieved in a few lines of code in a more concise manner, however, the goal is for higher-level abstractions (Viem, etc) built on top of Ox to handle this for you.
Check out the following places for more Ox-related content:
- Follow @wevm_dev, @jxom, and @awkweb on Twitter for project updates
- Join the discussions on GitHub