No seed phrases. No required API keys.
Session keys with spending limits, multi-solver routing, and cross-chain swaps —
built for AI agents and iOS apps, in three independently installable npm packages.
npm install @prism-ing/wallet
$ prism wallet create --name agent-1 ✓ Wallet ready EVM: 0x71C7656EC7ab88b098defB751B7401B5f6d8976F Solana: DRpbCBMxVnDK7maPM5tGv6MvB3v1sRMC86PZ8okm21hy Keys: ~/.ows/ (AES-256-GCM, never leaves disk) $ prism swap --from USDC:base --to USDC:arbitrum \ --amount 5000000 ✓ Cross-chain completed No ETH needed — fees settled from token balance. $ prism balance ✓ Total: $2,847.12 across all chains USDC Base $1,200.00 USDC Arbitrum $847.12 WETH Base $800.00 No stranded funds. No dust. One balance.
Funds stranded on the wrong chain. Transactions failing mid-run because there’s no gas on that chain. No way to see what the agent actually holds without querying a dozen RPCs.
As your agent transacts across chains, OneBalance tracks its full position in one place. Check the agent’s total USD balance with a single call — no matter how many chains it has touched. No dust, no gaps, no surprises.
A market-leading meta-DEX aggregator races multiple solvers on every quote across EVM, Solana, and cross-chain — best price wins automatically. Your wallet has instant access to the deepest liquidity in DeFi with no per-chain integration work.
OWS encrypted vault on Node.js (~/.ows/), Secure Enclave on iOS. The private key is never serialized, never passed to an external service, never visible to application code. Hardware-backed on both platforms.
Session keys enforce caps on every signing operation: per-op limit, total budget, allowed assets, time-boxed expiry, allowed recipients. ZeroDev reverts the transaction on-chain if any policy is violated — not in JavaScript.
Lost a device? Recover via passkey (iCloud Keychain), a trusted contact, or a second device. The smart contract rotates the authorized signer without touching the funds. No seed phrase to find. No funds lost.
Secure Enclave backend for iOS — biometric-gated signing, non-exportable keys. The same PrismSigner interface runs on Node.js agents and mobile apps. One SDK, two runtimes, identical security model.
A fully-featured CLI for wallets, swaps, and cross-chain operations. Works with the same wallet stack and swap infrastructure as the SDK — test quotes from the terminal, script payments in bash, or inspect chain-abstracted balances interactively.
wallet create
Create or load a named OWS wallet
swap
Quote and execute any swap — EVM, Solana, or cross-chain
balance
Show unified balance across all chains
status
Poll a cross-chain swap to completion
doctor
Check aggregator connectivity and wallet health
npm install -g @prism-ing/cli
$ prism swap \ --from USDC:base \ --to USDC:arbitrum \ --amount 5000000 ✓ Quote received: Route type: cross-chain Amount in: 5000000 Net out: 4982441 → Executing swap… → Cross-chain submitted. Waiting… → [5s] PENDING → [10s] PENDING → [22s] COMPLETED ✓ Cross-chain swap completed! Tx: 0x4d2a9f8b3c1e…
provider for testingimport { createProductionWallet } from '@prism-ing/wallet';
import { createOneBalanceProvider } from '@prism-ing/onebalance';
import { createSwapRouter } from '@prism-ing/swap-router';
// 1. Account abstraction — adds smart account + cross-chain balance
const provider = createOneBalanceProvider({ apiKey: process.env.ONEBALANCE_API_KEY });
// 2. Wallet — OWS persistent keys on Node.js, Secure Enclave on iOS
const walletResult = await createProductionWallet(
{ signer: { walletName: 'my-agent' } },
{ accountAbstraction: provider },
);
if (!walletResult.ok) throw new Error(walletResult.error.code);
const wallet = walletResult.value;
// 3. Swap router
const router = createSwapRouter({
baseUrl: 'https://aggregator.prism.ing/v1',
signer: wallet.signer,
evmRpcUrls: { 8453: process.env.BASE_RPC_URL },
});
// 4. Quote a cross-chain swap
const quote = await router.quote({
fromAsset: 'USDC:base',
toAsset: 'USDT:arbitrum',
amount: '1000000',
sender: wallet.evmAddress,
accounts: [{ type: 'kernel-v3.1-ecdsa', accountAddress: wallet.smartAccountAddress, signerAddress: wallet.evmAddress }],
});
// 5. Execute
if (quote.ok) {
const exec = await router.execute(quote.value);
console.log(exec.ok ? exec.value.status : exec.error.code);
}
Used in an AI agent? Pass wallet.signer directly to any framework's signing hook —
structurally compatible with anything that accepts signMessage / signTypedData.