Skip to content

Latest commit

 

History

History
152 lines (124 loc) · 3.72 KB

README.md

File metadata and controls

152 lines (124 loc) · 3.72 KB

Clef Client

Go Reference Go Version CI Status

A Go client library for interacting with the Ethereum Clef external signer. This library provides a clean, type-safe interface to communicate with Clef through both HTTP JSON-RPC and Unix Domain Socket (IPC) protocols. It supports all major Clef operations including account management, transaction signing, and data signing following various Ethereum standards.

Installation

go get github.com/AxLabs/clef-client

Usage

Creating a Client

You can create a client using either HTTP or IPC:

// Using HTTP
httpClient := clefclient.NewHTTPClient("http://localhost:8550")
defer httpClient.Close()

// Using IPC
ipcClient, err := clefclient.NewIPCClient("/path/to/clef.ipc")
if err != nil {
    log.Fatal(err)
}
defer ipcClient.Close()

Account Management

// List accounts
accounts, err := client.ListAccounts()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Available accounts: %v\n", accounts)

// Create new account
address, err := client.NewAccount()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("New account created: %s\n", address)

Signing Transactions

tx := &clefclient.Transaction{
    From:     "0x0000000000000000000000000000000000000001",
    To:       "0x0000000000000000000000000000000000000002",
    Gas:      "0x5208",
    GasPrice: "0x4a817c800",
    Value:    "0xde0b6b3a7640000", // 1 ETH in wei
    Nonce:    "0x0",
    Data:     "0x",
}

response, err := client.SignTransaction(tx)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Signed transaction: %s\n", response.Raw)

Signing Data

// Sign plain data
dataReq := &clefclient.SignDataRequest{
    Address: "0x0000000000000000000000000000000000000001",
    Data:    "0x48656c6c6f20576f726c64", // "Hello World" in hex
}

signature, err := client.SignData(dataReq)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Signature: %s\n", signature.Signature)

// Sign typed data (EIP-712)
typedData := []byte(`{
    "types": {
        "EIP712Domain": [
            {"name": "name", "type": "string"},
            {"name": "version", "type": "string"}
        ],
        "Person": [
            {"name": "name", "type": "string"},
            {"name": "wallet", "type": "address"}
        ]
    },
    "primaryType": "Person",
    "domain": {
        "name": "My App",
        "version": "1.0"
    },
    "message": {
        "name": "Alice",
        "wallet": "0x0000000000000000000000000000000000000001"
    }
}`)

typedReq := &clefclient.TypedDataRequest{
    Address:    "0x0000000000000000000000000000000000000001",
    TypedData:  typedData,
    RawVersion: "V4",
}

signature, err = client.SignTypedData(typedReq)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("EIP-712 Signature: %s\n", signature.Signature)

EC Recover

// Recover address from signature
recoverReq := &clefclient.EcRecoverRequest{
    Data:      "0x48656c6c6f20576f726c64",
    Signature: "0x4f355c7f6c7f7a4c...",
}

recovered, err := client.EcRecover(recoverReq)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Recovered address: %s\n", recovered.Address)

Version

// Get Clef version
version, err := client.Version()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Clef version: %s\n", version.Version)

License

Apache License 2.0 - See LICENSE file for details.