@moon-x/evm-adapter
v0.3.3
Published
Chain-aware EVM signing helpers for MoonX ephemeral signers. Builds the keccak256 digest and assembles ready-to-broadcast signatures/transactions so integrators never hand-roll payload construction.
Readme
@moon-x/evm-adapter
Chain-aware EVM signing helpers for MoonX ephemeral signers.
The low-level signWithEphemeralSigner primitive in @moon-x/core signs an
arbitrary keccak256 digest — which means the integrator is responsible for
building the exact bytes to sign (EIP-191 prefixing, EIP-712 hashing, RLP
serialization, EIP-7702 auth hashing) and for re-assembling the result into
something broadcastable. That's the most security-sensitive and error-prone
part of signing, and every integration ends up re-implementing the same
viem glue.
This adapter does it for you. You pass intent — a message, typed data, a transaction — and get back a ready-to-use artifact.
Install
pnpm add @moon-x/evm-adapter viemviem is a peer dependency, so your app's single viem instance is the one
used.
Usage
import { createEvmSigner } from "@moon-x/evm-adapter";
const signer = createEvmSigner({
apiPubHex, // from provisioning
apiPrivHex, // never leaves your backend
walletId, // the EVM wallet the agent was provisioned for
baseUrl, // wallets backend URL
secretKey, // moon_sk_* (server-only; the sign routes are secret-key-only)
});
// EIP-191 personal message → 65-byte 0x signature
const sig = await signer.signMessage("gm");
// EIP-712 typed data → 65-byte 0x signature
const tdSig = await signer.signTypedData(typedData);
// Transaction → wire-ready serialized tx for eth_sendRawTransaction
const rawTx = await signer.signTransaction({
type: "eip1559",
chainId: 1,
nonce: 0,
to,
value: 0n,
maxFeePerGas: 2_000_000_000n,
maxPriorityFeePerGas: 1_000_000_000n,
gas: 21_000n,
});
// EIP-7702 authorization → signed authorization for authorizationList
const signedAuth = await signer.signAuthorization(authorization);Scheme safety
The adapter enforces that the target wallet is ECDSA/secp256k1. Pointing it at
an ed25519 (Solana) wallet throws EvmSchemeMismatchError instead of producing
a valid-but-wrong signature — use @moon-x/solana-adapter for those.
Escape hatch
For custom chains or digests this adapter doesn't model, drop down to
signWithEphemeralSigner from @moon-x/core/sdk and build the digest yourself.
