From af055d96612f3d8744239100b78296ca1c24e1ea Mon Sep 17 00:00:00 2001 From: Kevin Arifin Date: Wed, 25 Mar 2026 22:06:11 -0700 Subject: [PATCH] feat: add OWS wallet provider for EVM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `owsEvmWalletProvider()` — creates an EVM wallet provider from an OWS encrypted vault. No more PRIVATE_KEY env vars or wallet_data.txt. Usage: const provider = owsEvmWalletProvider("my-agent-wallet"); --- .../wallet-providers/owsEvmWalletProvider.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 typescript/agentkit/src/wallet-providers/owsEvmWalletProvider.ts diff --git a/typescript/agentkit/src/wallet-providers/owsEvmWalletProvider.ts b/typescript/agentkit/src/wallet-providers/owsEvmWalletProvider.ts new file mode 100644 index 000000000..f8aa8e366 --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/owsEvmWalletProvider.ts @@ -0,0 +1,40 @@ +import { privateKeyToAccount } from "viem/accounts"; +import { EvmWalletProvider } from "./evmWalletProvider"; + +/** + * Create an EVM wallet provider from an OWS encrypted vault. + * + * @param walletNameOrId - OWS wallet name or UUID + * @returns A configured EvmWalletProvider + * + * @example + * ```ts + * import { owsEvmWalletProvider } from "@coinbase/agentkit"; + * const provider = owsEvmWalletProvider("my-agent-wallet"); + * ``` + */ +export function owsEvmWalletProvider(walletNameOrId: string): EvmWalletProvider { + const { exportWallet } = require("@open-wallet-standard/core") as { + exportWallet: (nameOrId: string) => string; + }; + + const exported = exportWallet(walletNameOrId); + let privateKey: `0x${string}`; + + try { + const keys = JSON.parse(exported); + const hex = keys.secp256k1 ?? ""; + privateKey = (hex.startsWith("0x") ? hex : `0x${hex}`) as `0x${string}`; + } catch { + const { deriveAddress } = require("@open-wallet-standard/core") as { + deriveAddress: (mnemonic: string, chain: string) => { private_key?: string; privateKey?: string }; + }; + const info = deriveAddress(exported, "evm"); + const hex = info.private_key ?? info.privateKey ?? ""; + privateKey = (hex.startsWith("0x") ? hex : `0x${hex}`) as `0x${string}`; + } + + // Use the ViemWalletProvider with the decrypted key + const { ViemWalletProvider } = require("./viemWalletProvider"); + return ViemWalletProvider.fromPrivateKey(privateKey); +}