Unified identity
One account record per end-user or business, referenced consistently across every module. Your KYC/KYB stack feeds it the verified identity; the account carries it forward.
The accounts module gives every human and business a single account with unified identity, scoped permissions, delegated access, and a recovery model you choose. Today the proof rail is ERC-4337 smart-contract wallets with passkeys and gasless flows, non-custodial, multi-chain, and embedded under your own brand and license. The same account record carries through routing, settlement, policy, and audit.
One account record per end-user or business, referenced consistently across every module. Your KYC/KYB stack feeds it the verified identity; the account carries it forward.
Scope what each account, team member, or delegate is allowed to do. Grant time-boxed, limited authority without handing over the root key.
Passkey only, passkey plus social, or passkey plus MPC. You pick the recovery model that fits your license and your jurisdiction.
No seed phrase, no extension install. WebAuthn plus platform biometric. A login flow your compliance and product teams already approve of.
You sponsor network fees through paymaster-backed transactions; the end-user never sees ETH. Recover the cost through your pricing tier or transaction flow.
OVAAL does not custody end-user funds. Custody, where applicable, is provided by the partner or an authorised provider. Liability stays partner-side; funds stay end-user-side.
Account orchestration is the module. ERC-4337 wallets are the rail that proves it ships today.
Your brand. Your KYC. Your identity stack.
Identity, permissions, recovery, AA orchestration, paymaster policy, session keys.
Passkey or MPC share. Non-custodial. On-chain smart account.
Base, Arbitrum, Optimism, and Ethereum are supported in production. Additional chains and account rails ship per partner demand. The wallet rail is one execution path beneath the accounts module, not the module itself.
import { OvaalClient } from '@ovaal/sdk';
const ovaal = new OvaalClient({
apiKey: process.env.OVAAL_API_KEY,
partnerId: 'prt_...',
environment: 'staging',
});
const account = await ovaal.accounts.create({
partnerUserId: 'user_abc123',
rail: 'aa-wallet',
chain: 'base',
recovery: { type: 'passkey' },
policy: {
maxTxValueUsd: 10_000,
dailyCapUsd: 50_000,
jurisdiction: 'DE',
},
});
// Returns: { accountId, address, recoveryHandle }
What the partner keeps: