Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Xpersona Agent
Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Skill: Zyfai Yield Automation Owner: PaulDeFi Summary: Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Tags: latest:1.0.8 Version history: v1.0.8 | 2026-02-19T17:36:35.942Z | user - Added support for connecting to Zyfai using a wallet provider (e.g., MetaMask), a viem WalletClient, or a raw private key. - U
clawhub skill install kn788ynsr62y24k11bfmrtc9ph80cvdh:zyfai-sdkOverall rank
#62
Adoption
1.9K downloads
Trust
Unknown
Freshness
Feb 28, 2026
Freshness
Last checked Feb 28, 2026
Best For
Zyfai Yield Automation is best for general automation workflows where OpenClaw compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
editorial-content, CLAWHUB, runtime-metrics, public facts pack
Key links, install path, reliability highlights, and the shortest practical read before diving into the crawl record.
Overview
Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Skill: Zyfai Yield Automation Owner: PaulDeFi Summary: Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Tags: latest:1.0.8 Version history: v1.0.8 | 2026-02-19T17:36:35.942Z | user - Added support for connecting to Zyfai using a wallet provider (e.g., MetaMask), a viem WalletClient, or a raw private key. - U Capability contract not published. No trust telemetry is available yet. 1.9K downloads reported by the source. Last updated 4/15/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Feb 28, 2026
Vendor
Clawhub
Artifacts
0
Benchmarks
0
Last release
1.0.8
Install & run
clawhub skill install kn788ynsr62y24k11bfmrtc9ph80cvdh:zyfai-sdkSetup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Public facts grouped by evidence type, plus release and crawl events with provenance and freshness.
Public facts
Vendor
Clawhub
Protocol compatibility
OpenClaw
Latest release
1.0.8
Adoption signal
1.9K downloads
Handshake status
UNKNOWN
Parameters, dependencies, examples, extracted files, editorial overview, and the complete README when available.
Captured outputs
Extracted files
2
Examples
6
Snippets
0
Languages
Unknown
text
┌─────────────────┐ ┌──────────────────────┐ │ User's EOA │ ───► │ Zyfai Subaccount │ │ (their wallet) │ │ (Safe smart wallet) │ │ │ │ │ │ Owns & controls│ │ • Auto-rebalancing │ │ │ │ • Yield optimization│ │ │ │ • Non-custodial │ └─────────────────┘ └──────────────────────┘
text
1. DEPLOY → Create subaccount linked to user's wallet 2. SESSION → Enable automated yield optimization 3. DEPOSIT → Send funds to subaccount (starts earning) 4. WITHDRAW → Pull funds back to wallet (anytime)
bash
npm install @zyfai/sdk viem
bash
POST https://sdk.zyf.ai/api/sdk-api-keys/create
Content-Type: application/json
{
"clientName": "my-agent",
"walletAddress": "0x...",
"email": "agent@example.com"
}json
{
"success": true,
"message": "SDK API key created successfully. Store the apiKey securely - it cannot be retrieved later!",
"data": {
"id": "936...",
"apiKey": "zyfai_361ad41d083c2fe.....",
"keyPrefix": "zyfai_361ad4",
"clientName": "my-agent",
"ownerWalletAddress": "0x..."
}
}typescript
import { ZyfaiSDK } from "@zyfai/sdk";
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// Connect using injected wallet provider (MetaMask, WalletConnect, etc.)
await sdk.connectAccount(window.ethereum, 8453);SKILL.md
---
name: zyfai
description: Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit/withdraw anytime.
---
# Zyfai — Yield for Any Wallet
Turn any Ethereum wallet into a yield-generating account.
## What This Does
When a user wants to **earn yield** on their crypto, Zyfai creates a **subaccount** (Safe smart wallet) linked to their existing wallet (EOA). Funds deposited into this subaccount are automatically optimized across DeFi protocols. The user stays in full control and can withdraw anytime.
```
┌─────────────────┐ ┌──────────────────────┐
│ User's EOA │ ───► │ Zyfai Subaccount │
│ (their wallet) │ │ (Safe smart wallet) │
│ │ │ │
│ Owns & controls│ │ • Auto-rebalancing │
│ │ │ • Yield optimization│
│ │ │ • Non-custodial │
└─────────────────┘ └──────────────────────┘
```
**Key points:**
- The subaccount is **owned by the user's EOA** — only they can withdraw
- Session keys allow **automated rebalancing** but cannot withdraw to other addresses
- Same EOA = same subaccount address across all chains
## The Flow
```
1. DEPLOY → Create subaccount linked to user's wallet
2. SESSION → Enable automated yield optimization
3. DEPOSIT → Send funds to subaccount (starts earning)
4. WITHDRAW → Pull funds back to wallet (anytime)
```
## Prerequisites
- **API Key** — Get one programmatically (see below) or manually at [sdk.zyf.ai](https://sdk.zyf.ai)
- **Wallet Connection** — Either a wallet provider (browser) or secure key management (server)
- **Node.js 18+**
```bash
npm install @zyfai/sdk viem
```
### Programmatic API Key Creation (Agent-Native)
Agents can create their own API key without human intervention. You need the wallet address (public key) of the agent.
```bash
POST https://sdk.zyf.ai/api/sdk-api-keys/create
Content-Type: application/json
{
"clientName": "my-agent",
"walletAddress": "0x...",
"email": "agent@example.com"
}
```
**Response:**
```json
{
"success": true,
"message": "SDK API key created successfully. Store the apiKey securely - it cannot be retrieved later!",
"data": {
"id": "936...",
"apiKey": "zyfai_361ad41d083c2fe.....",
"keyPrefix": "zyfai_361ad4",
"clientName": "my-agent",
"ownerWalletAddress": "0x..."
}
}
```
> **Important:** Store the `apiKey` securely — it cannot be retrieved later. The key is linked to the provided wallet address.
## Supported Chains
| Chain | ID |
|----------|-------|
| Arbitrum | 42161 |
| Base | 8453 |
| Plasma | 9745 |
## Important: Always Use EOA Address
When calling SDK methods, **always pass the EOA address** (the user's wallet address) as `userAddress` — never the subaccount/Safe address. The SDK derives the suba_meta.json
{
"ownerId": "kn788ynsr62y24k11bfmrtc9ph80cvdh",
"slug": "zyfai-sdk",
"version": "1.0.8",
"publishedAt": 1771522595942
}Editorial read
Docs source
CLAWHUB
Editorial quality
ready
Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Skill: Zyfai Yield Automation Owner: PaulDeFi Summary: Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount... Tags: latest:1.0.8 Version history: v1.0.8 | 2026-02-19T17:36:35.942Z | user - Added support for connecting to Zyfai using a wallet provider (e.g., MetaMask), a viem WalletClient, or a raw private key. - U
Skill: Zyfai Yield Automation
Owner: PaulDeFi
Summary: Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount...
Tags: latest:1.0.8
Version history:
v1.0.8 | 2026-02-19T17:36:35.942Z | user
v1.0.7 | 2026-02-18T17:19:36.338Z | user
zyfai-sdk 1.0.7 Changelog
v1.0.6 | 2026-02-12T08:57:55.778Z | user
v1.0.5 | 2026-02-06T11:45:35.126Z | user
zyfai-sdk v1.0.5
v1.0.4 | 2026-02-04T08:52:22.586Z | user
zyfai-sdk 1.0.4
getAPYPerStrategy method to the API, allowing users to retrieve APY data for conservative and aggressive strategies.v1.0.3 | 2026-02-02T12:40:47.383Z | user
No user-facing or code changes detected in this version.
v1.0.2 | 2026-02-02T10:52:49.856Z | user
v1.0.1 | 2026-02-02T09:09:07.448Z | user
v1.0.0 | 2026-02-02T08:45:55.356Z | user
zyfai-sdk 1.0.0 initial release:
Archive index:
Archive v1.0.8: 2 files, 8152 bytes
Files: SKILL.md (25683b), _meta.json (128b)
File v1.0.8:SKILL.md
Turn any Ethereum wallet into a yield-generating account.
When a user wants to earn yield on their crypto, Zyfai creates a subaccount (Safe smart wallet) linked to their existing wallet (EOA). Funds deposited into this subaccount are automatically optimized across DeFi protocols. The user stays in full control and can withdraw anytime.
┌─────────────────┐ ┌──────────────────────┐
│ User's EOA │ ───► │ Zyfai Subaccount │
│ (their wallet) │ │ (Safe smart wallet) │
│ │ │ │
│ Owns & controls│ │ • Auto-rebalancing │
│ │ │ • Yield optimization│
│ │ │ • Non-custodial │
└─────────────────┘ └──────────────────────┘
Key points:
1. DEPLOY → Create subaccount linked to user's wallet
2. SESSION → Enable automated yield optimization
3. DEPOSIT → Send funds to subaccount (starts earning)
4. WITHDRAW → Pull funds back to wallet (anytime)
npm install @zyfai/sdk viem
Agents can create their own API key without human intervention. You need the wallet address (public key) of the agent.
POST https://sdk.zyf.ai/api/sdk-api-keys/create
Content-Type: application/json
{
"clientName": "my-agent",
"walletAddress": "0x...",
"email": "agent@example.com"
}
Response:
{
"success": true,
"message": "SDK API key created successfully. Store the apiKey securely - it cannot be retrieved later!",
"data": {
"id": "936...",
"apiKey": "zyfai_361ad41d083c2fe.....",
"keyPrefix": "zyfai_361ad4",
"clientName": "my-agent",
"ownerWalletAddress": "0x..."
}
}
Important: Store the
apiKeysecurely — it cannot be retrieved later. The key is linked to the provided wallet address.
| Chain | ID | |----------|-------| | Arbitrum | 42161 | | Base | 8453 | | Plasma | 9745 |
When calling SDK methods, always pass the EOA address (the user's wallet address) as userAddress — never the subaccount/Safe address. The SDK derives the subaccount address automatically from the EOA.
The SDK supports multiple ways to connect a wallet. Choose based on your security requirements and deployment context.
Use an injected wallet provider like MetaMask. The private key never leaves the user's wallet.
import { ZyfaiSDK } from "@zyfai/sdk";
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// Connect using injected wallet provider (MetaMask, WalletConnect, etc.)
await sdk.connectAccount(window.ethereum, 8453);
Security: The private key stays in the user's wallet. The SDK only requests signatures when needed.
Use a pre-configured viem WalletClient. This is the recommended approach for server-side agents as it allows integration with secure key management solutions.
import { ZyfaiSDK } from "@zyfai/sdk";
import { createWalletClient, http } from "viem";
import { base } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";
// Create wallet client with your preferred key management
// Option A: From environment variable (simple but requires secure env management)
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
// Option B: From KMS (AWS, GCP, etc.) - recommended for production
// const account = await getAccountFromKMS();
// Option C: From Wallet-as-a-Service (Turnkey, Privy, etc.)
// const account = await turnkeyClient.getAccount();
const walletClient = createWalletClient({
account,
chain: base,
transport: http(),
});
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// Connect using the WalletClient
await sdk.connectAccount(walletClient, 8453);
Security: The WalletClient abstraction allows you to integrate with secure key management solutions like:
Direct private key usage.
import { ZyfaiSDK } from "@zyfai/sdk";
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// WARNING: Only use for development. Never hardcode private keys in production.
await sdk.connectAccount(process.env.PRIVATE_KEY, 8453);
Security Warning: Raw private keys in environment variables are a security risk. For production autonomous agents, use Option 2 with a proper key management solution.
| Method | Security Level | Use Case | |--------|---------------|----------| | Wallet Provider | High | Browser dApps, user-facing apps | | WalletClient + KMS | High | Production server agents | | WalletClient + WaaS | High | Production server agents | | Private Key String | Low | Development/testing only |
import { ZyfaiSDK } from "@zyfai/sdk";
import { createWalletClient, http } from "viem";
import { base } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// For browser: use wallet provider
await sdk.connectAccount(window.ethereum, 8453);
// For server: use WalletClient (see Wallet Connection Options above)
const walletClient = createWalletClient({
account: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`),
chain: base,
transport: http(),
});
await sdk.connectAccount(walletClient, 8453);
const userAddress = "0x..."; // User's EOA (NOT the subaccount address!)
const chainId = 8453; // Base
// Check if subaccount exists
const wallet = await sdk.getSmartWalletAddress(userAddress, chainId);
console.log(`Subaccount: ${wallet.address}`);
console.log(`Deployed: ${wallet.isDeployed}`);
// Deploy if needed
if (!wallet.isDeployed) {
const result = await sdk.deploySafe(userAddress, chainId, "conservative");
console.log("Subaccount deployed:", result.safeAddress);
}
Strategies:
"conservative" — Stable yield, lower risk"aggressive" — Higher yield, higher riskawait sdk.createSessionKey(userAddress, chainId);
// Always verify the session key was activated
const user = await sdk.getUserDetails();
if (!user.user.hasActiveSessionKey) {
// Session key not active — retry the process
console.log("Session key not active, retrying...");
await sdk.createSessionKey(userAddress, chainId);
// Verify again
const userRetry = await sdk.getUserDetails();
if (!userRetry.user.hasActiveSessionKey) {
throw new Error("Session key activation failed after retry. Contact support.");
}
}
console.log("Session key active:", user.user.hasActiveSessionKey);
This allows Zyfai to rebalance funds automatically. Session keys cannot withdraw to arbitrary addresses — only optimize within the protocol.
Important: Always verify the session key is active by checking
getUserDetails().user.hasActiveSessionKeyafter callingcreateSessionKey. If it returnsfalse, retry the process. A session key must be active for automated yield optimization to work.
// Deposit 10 USDC (6 decimals)
await sdk.depositFunds(userAddress, chainId, "10000000");
Funds move from EOA -> Subaccount and start earning yield immediately.
// Withdraw everything
await sdk.withdrawFunds(userAddress, chainId);
// Or withdraw partial (5 USDC)
await sdk.withdrawFunds(userAddress, chainId, "5000000");
Funds return to the user's EOA. Withdrawals are processed asynchronously.
await sdk.disconnectAccount();
import { ZyfaiSDK } from "@zyfai/sdk";
import { createWalletClient, http } from "viem";
import { base } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";
async function startEarningYield(userAddress: string) {
const sdk = new ZyfaiSDK({ apiKey: process.env.ZYFAI_API_KEY! });
const chainId = 8453; // Base
// Connect using WalletClient (recommended for server agents)
const walletClient = createWalletClient({
account: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`),
chain: base,
transport: http(),
});
await sdk.connectAccount(walletClient, chainId);
// Deploy subaccount if needed (always pass EOA as userAddress)
const wallet = await sdk.getSmartWalletAddress(userAddress, chainId);
if (!wallet.isDeployed) {
await sdk.deploySafe(userAddress, chainId, "conservative");
console.log("Subaccount created:", wallet.address);
}
// Enable automated optimization
await sdk.createSessionKey(userAddress, chainId);
// Verify session key is active
const user = await sdk.getUserDetails();
if (!user.user.hasActiveSessionKey) {
console.log("Session key not active, retrying...");
await sdk.createSessionKey(userAddress, chainId);
const userRetry = await sdk.getUserDetails();
if (!userRetry.user.hasActiveSessionKey) {
throw new Error("Session key activation failed. Contact support.");
}
}
// Deposit 100 USDC
await sdk.depositFunds(userAddress, chainId, "100000000");
console.log("Deposited! Now earning yield.");
await sdk.disconnectAccount();
}
async function withdrawYield(userAddress: string, amount?: string) {
const sdk = new ZyfaiSDK({ apiKey: process.env.ZYFAI_API_KEY! });
const chainId = 8453; // Base
// Connect using WalletClient
const walletClient = createWalletClient({
account: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`),
chain: base,
transport: http(),
});
await sdk.connectAccount(walletClient, chainId);
// Withdraw funds (pass EOA as userAddress)
if (amount) {
// Partial withdrawal
await sdk.withdrawFunds(userAddress, chainId, amount);
console.log(`Withdrawn ${amount} (6 decimals) to EOA`);
} else {
// Full withdrawal
await sdk.withdrawFunds(userAddress, chainId);
console.log("Withdrawn all funds to EOA");
}
await sdk.disconnectAccount();
}
| Method | Params | Description |
|--------|--------|-------------|
| connectAccount | (walletClientOrProvider, chainId) | Authenticate with Zyfai |
| getSmartWalletAddress | (userAddress, chainId) | Get subaccount address & status |
| deploySafe | (userAddress, chainId, strategy) | Create subaccount |
| createSessionKey | (userAddress, chainId) | Enable auto-optimization |
| depositFunds | (userAddress, chainId, amount) | Deposit USDC (6 decimals) |
| withdrawFunds | (userAddress, chainId, amount?) | Withdraw (all if no amount) |
| getPositions | (userAddress, chainId?) | Get active DeFi positions |
| getAvailableProtocols | (chainId) | Get available protocols & pools |
| getAPYPerStrategy | (crossChain?, days?, strategyType?) | Get APY for conservative/aggressive strategies |
| getUserDetails | () | Get authenticated user details |
| getOnchainEarnings | (walletAddress) | Get earnings data |
| updateUserProfile | (params) | Update strategy, protocols, splitting, cross-chain settings |
| registerAgentOnIdentityRegistry | (smartWallet, chainId) | Register agent on ERC-8004 Identity Registry |
| disconnectAccount | () | End session |
Note: All methods that take userAddress expect the EOA address, not the subaccount/Safe address.
Get all active DeFi positions for a user across protocols. Optionally filter by chain.
Parameters:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | userAddress | string | Yes | User's EOA address | | chainId | SupportedChainId | No | Optional: Filter by specific chain ID |
Example:
// Get all positions across all chains
const positions = await sdk.getPositions("0xUser...");
// Get positions on Arbitrum only
const arbPositions = await sdk.getPositions("0xUser...", 42161);
Returns:
interface PositionsResponse {
success: boolean;
userAddress: string;
positions: Position[];
}
Get available DeFi protocols and pools for a specific chain with APY data.
const protocols = await sdk.getAvailableProtocols(42161); // Arbitrum
protocols.protocols.forEach((protocol) => {
console.log(`${protocol.name} (ID: ${protocol.id})`);
if (protocol.pools) {
protocol.pools.forEach((pool) => {
console.log(` Pool: ${pool.name} - APY: ${pool.apy || "N/A"}%`);
});
}
});
Returns:
interface ProtocolsResponse {
success: boolean;
chainId: SupportedChainId;
protocols: Protocol[];
}
Get current authenticated user details including smart wallet, chains, protocols, and settings. Requires SIWE authentication.
await sdk.connectAccount(walletClient, chainId);
const user = await sdk.getUserDetails();
console.log("Smart Wallet:", user.user.smartWallet);
console.log("Chains:", user.user.chains);
console.log("Has Active Session:", user.user.hasActiveSessionKey);
Returns:
interface UserDetailsResponse {
success: boolean;
user: {
id: string;
address: string;
smartWallet?: string;
chains: number[];
protocols: Protocol[];
hasActiveSessionKey: boolean;
email?: string;
strategy?: string;
telegramId?: string;
walletType?: string;
autoSelectProtocols: boolean;
autocompounding?: boolean;
omniAccount?: boolean;
crosschainStrategy?: boolean;
agentName?: string;
customization?: Record<string, string[]>;
};
}
Update the authenticated user's profile settings including strategy, protocols, splitting, and cross-chain options. Requires SIWE authentication.
sdk.updateUserProfile(params: UpdateUserProfileRequest): Promise<UpdateUserProfileResponse>
Parameters:
interface UpdateUserProfileRequest {
/** Investment strategy: "conservative" for safer yields, "aggressive" for higher risk/reward */
strategy?: "conservative" | "aggressive";
/** Array of protocol IDs to use for yield optimization */
protocols?: string[];
/** Enable omni-account feature for cross-chain operations */
omniAccount?: boolean;
/** Enable automatic compounding of earned yields (default: true) */
autocompounding?: boolean;
/** Custom name for your agent */
agentName?: string;
/** Enable cross-chain strategy execution */
crosschainStrategy?: boolean;
/** Enable position splitting across multiple protocols */
splitting?: boolean;
/** Minimum number of splits when position splitting is enabled (1-4) */
minSplits?: number;
}
Returns:
interface UpdateUserProfileResponse {
success: boolean;
userId: string;
smartWallet?: string;
chains?: number[];
strategy?: string;
protocols?: string[];
omniAccount?: boolean;
autocompounding?: boolean;
agentName?: string;
crosschainStrategy?: boolean;
executorProxy?: boolean;
splitting?: boolean;
minSplits?: number;
}
Examples:
// Update strategy from conservative to aggressive
await sdk.updateUserProfile({
strategy: "aggressive",
});
// Configure specific protocols
const protocolsResponse = await sdk.getAvailableProtocols(8453);
const selectedProtocols = protocolsResponse.protocols
.filter(p => ["Aave", "Compound", "Moonwell"].includes(p.name))
.map(p => p.id);
await sdk.updateUserProfile({
protocols: selectedProtocols,
});
// Enable position splitting (distribute across multiple protocols)
await sdk.updateUserProfile({
splitting: true,
minSplits: 3, // Split across at least 3 protocols
});
// Verify changes
const userDetails = await sdk.getUserDetails();
console.log("Strategy:", userDetails.user.strategy);
console.log("Splitting:", userDetails.user.splitting);
Cross-chain strategies: Only enable cross-chain when the user explicitly requests it. For cross-chain to work, both
crosschainStrategyandomniAccountmust be set totrue. Never enable cross-chain settings by default.
// Enable cross-chain ONLY when explicitly requested by the user
await sdk.updateUserProfile({
crosschainStrategy: true,
omniAccount: true,
});
// Now funds can be rebalanced across configured chains
const user = await sdk.getUserDetails();
console.log("Operating on chains:", user.user.chains);
Notes:
getAvailableProtocols(chainId) to get valid protocol IDs before updating.minSplits is set to 2, 3, or 4, funds are always distributed across at least that many pools for improved risk diversification (up to 4 DeFi pools). This guarantees your funds will be split regardless of market conditions.crosschainStrategy: true AND omniAccount: true. Only activate when the user explicitly asks for cross-chain yield optimization. Chains are configured during initial setup and cannot be changed via this method.true, yields are reinvested automatically.executorProxy cannot be updated via this method.Get global APY by strategy type (conservative or aggressive), time period, and chain configuration. Use this to compare expected returns between strategies before deploying.
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| crossChain | boolean | No | If true, returns APY for cross-chain strategies; if false, single-chain |
| days | number | No | Period over which APY is calculated. One of 7, 15, 30, 60 |
| strategyType | string | No | Strategy risk profile. One of 'conservative' or 'aggressive' |
Example:
// Get 7-day APY for conservative single-chain strategy
const conservativeApy = await sdk.getAPYPerStrategy(false, 7, 'conservative');
console.log("Conservative APY:", conservativeApy.data);
// Get 30-day APY for aggressive cross-chain strategy
const aggressiveApy = await sdk.getAPYPerStrategy(true, 30, 'aggressive');
console.log("Aggressive APY:", aggressiveApy.data);
// Compare strategies
const conservative = await sdk.getAPYPerStrategy(false, 30, 'conservative');
const aggressive = await sdk.getAPYPerStrategy(false, 30, 'aggressive');
console.log(`Conservative 30d APY: ${conservative.data[0]?.apy}%`);
console.log(`Aggressive 30d APY: ${aggressive.data[0]?.apy}%`);
Returns:
interface APYPerStrategyResponse {
success: boolean;
count: number;
data: APYPerStrategy[];
}
interface APYPerStrategy {
strategyType: string;
apy: number;
period: number;
crossChain: boolean;
}
Get onchain earnings for a wallet including total, current, and lifetime earnings.
const earnings = await sdk.getOnchainEarnings(smartWalletAddress);
console.log("Total earnings:", earnings.data.totalEarnings);
console.log("Current earnings:", earnings.data.currentEarnings);
console.log("Lifetime earnings:", earnings.data.lifetimeEarnings);
Returns:
interface OnchainEarningsResponse {
success: boolean;
data: {
walletAddress: string;
totalEarnings: number;
currentEarnings: number;
lifetimeEarnings: number;
unrealizedEarnings?: number;
currentEarningsByChain?: Record<string, number>;
unrealizedEarningsByChain?: Record<string, number>;
lastCheckTimestamp?: string;
};
}
Register your Zyfai deployed agent on the Identity Registry following the ERC-8004 standard. This is used for OpenClaw agent registration. The method fetches a tokenUri containing the agent's metadata stored on IPFS, then registers it on-chain.
Supported Chains:
| Chain | Chain ID | |-------|----------| | Base | 8453 | | Arbitrum | 42161 |
Parameters:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | smartWallet | string | Yes | The Zyfai deployed smart wallet address to register as an agent | | chainId | SupportedChainId | Yes | Chain ID (only 8453 or 42161) |
Example:
const sdk = new ZyfaiSDK({ apiKey: "your-api-key" });
await sdk.connectAccount(walletClient, 8453);
// Get smart wallet address
const walletInfo = await sdk.getSmartWalletAddress(userAddress, 8453);
const smartWallet = walletInfo.address;
// Register agent on Identity Registry
const result = await sdk.registerAgentOnIdentityRegistry(smartWallet, 8453);
console.log("Registration successful:");
console.log(" Tx Hash:", result.txHash);
console.log(" Chain ID:", result.chainId);
console.log(" Smart Wallet:", result.smartWallet);
Returns:
interface RegisterAgentResponse {
success: boolean;
txHash: string;
chainId: number;
smartWallet: string;
}
How It Works:
tokenUri from the Zyfai API (agent metadata stored on IPFS)register(tokenUri) call for the Identity Registry contractFor production autonomous agents, we recommend:
The subaccount address should be identical across all chains for the same EOA. If you see different addresses:
// Check addresses on both chains
const baseWallet = await sdk.getSmartWalletAddress(userAddress, 8453);
const arbWallet = await sdk.getSmartWalletAddress(userAddress, 42161);
if (baseWallet.address !== arbWallet.address) {
console.error("Address mismatch! Contact support.");
}
If addresses don't match:
This means the wallet isn't registered in the backend. Solution:
deploySafe() first — even if the Safe is already deployed on-chain, this registers it with the backendcreateSessionKey()This typically means:
Verify you're using the correct wallet for the EOA.
POST /api/sdk-api-keys/createFile v1.0.8:_meta.json
{ "ownerId": "kn788ynsr62y24k11bfmrtc9ph80cvdh", "slug": "zyfai-sdk", "version": "1.0.8", "publishedAt": 1771522595942 }
Archive v1.0.7: 2 files, 6990 bytes
Files: SKILL.md (21347b), _meta.json (128b)
File v1.0.7:SKILL.md
Turn any Ethereum wallet into a yield-generating account.
When a user wants to earn yield on their crypto, Zyfai creates a subaccount (Safe smart wallet) linked to their existing wallet (EOA). Funds deposited into this subaccount are automatically optimized across DeFi protocols. The user stays in full control and can withdraw anytime.
┌─────────────────┐ ┌──────────────────────┐
│ User's EOA │ ───► │ Zyfai Subaccount │
│ (their wallet) │ │ (Safe smart wallet) │
│ │ │ │
│ Owns & controls│ │ • Auto-rebalancing │
│ │ │ • Yield optimization│
│ │ │ • Non-custodial │
└─────────────────┘ └──────────────────────┘
Key points:
1. DEPLOY → Create subaccount linked to user's wallet
2. SESSION → Enable automated yield optimization
3. DEPOSIT → Send funds to subaccount (starts earning)
4. WITHDRAW → Pull funds back to wallet (anytime)
npm install @zyfai/sdk viem
Agents can create their own API key without human intervention:
POST https://sdk.zyf.ai/api/sdk-api-keys/create
Content-Type: application/json
{
"clientName": "my-agent",
"walletAddress": "0x...",
"email": "agent@example.com"
}
Response:
{
"success": true,
"message": "SDK API key created successfully. Store the apiKey securely - it cannot be retrieved later!",
"data": {
"id": "936...",
"apiKey": "zyfai_361ad41d083c2fe.....",
"keyPrefix": "zyfai_361ad4",
"clientName": "my-agent",
"ownerWalletAddress": "0x..."
}
}
Important: Store the
apiKeysecurely — it cannot be retrieved later. The key is linked to the provided wallet address.
| Chain | ID | |----------|-------| | Arbitrum | 42161 | | Base | 8453 | | Plasma | 9745 |
When calling SDK methods, always pass the EOA address (the user's wallet address) as userAddress — never the subaccount/Safe address. The SDK derives the subaccount address automatically from the EOA.
import { ZyfaiSDK } from "@zyfai/sdk";
const sdk = new ZyfaiSDK({ apiKey: "your-api-key", referralSource: "openclaw-skill" });
// Use the private key provided by the agent
await sdk.connectAccount(privateKey, 8453); // chainId
Important: Always use the private key that the agent has access to. The private key must correspond to the EOA you're operating on.
const userAddress = "0x..."; // User's EOA (NOT the subaccount address!)
const chainId = 8453; // Base
// Check if subaccount exists
const wallet = await sdk.getSmartWalletAddress(userAddress, chainId);
console.log(`Subaccount: ${wallet.address}`);
console.log(`Deployed: ${wallet.isDeployed}`);
// Deploy if needed
if (!wallet.isDeployed) {
const result = await sdk.deploySafe(userAddress, chainId, "conservative");
console.log("Subaccount deployed:", result.safeAddress);
}
Strategies:
"conservative" — Stable yield, lower risk"aggressive" — Higher yield, higher riskawait sdk.createSessionKey(userAddress, chainId);
// Always verify the session key was activated
const user = await sdk.getUserDetails();
if (!user.user.hasActiveSessionKey) {
// Session key not active — retry the process
console.log("Session key not active, retrying...");
await sdk.createSessionKey(userAddress, chainId);
// Verify again
const userRetry = await sdk.getUserDetails();
if (!userRetry.user.hasActiveSessionKey) {
throw new Error("Session key activation failed after retry. Contact support.");
}
}
console.log("Session key active:", user.user.hasActiveSessionKey);
This allows Zyfai to rebalance funds automatically. Session keys cannot withdraw to arbitrary addresses — only optimize within the protocol.
Important: Always verify the session key is active by checking
getUserDetails().user.hasActiveSessionKeyafter callingcreateSessionKey. If it returnsfalse, retry the process. A session key must be active for automated yield optimization to work.
// Deposit 10 USDC (6 decimals)
await sdk.depositFunds(userAddress, chainId, "10000000");
Funds move from EOA → Subaccount and start earning yield immediately.
// Withdraw everything
await sdk.withdrawFunds(userAddress, chainId);
// Or withdraw partial (5 USDC)
await sdk.withdrawFunds(userAddress, chainId, "5000000");
Funds return to the user's EOA. Withdrawals are processed asynchronously.
await sdk.disconnectAccount();
import { ZyfaiSDK } from "@zyfai/sdk";
async function startEarningYield(userAddress: string, privateKey: string) {
const sdk = new ZyfaiSDK({ apiKey: process.env.ZYFAI_API_KEY! });
const chainId = 8453; // Base
// Connect using the agent's private key
await sdk.connectAccount(privateKey, chainId);
// Deploy subaccount if needed (always pass EOA as userAddress)
const wallet = await sdk.getSmartWalletAddress(userAddress, chainId);
if (!wallet.isDeployed) {
await sdk.deploySafe(userAddress, chainId, "conservative");
console.log("Subaccount created:", wallet.address);
}
// Enable automated optimization
await sdk.createSessionKey(userAddress, chainId);
// Verify session key is active
const user = await sdk.getUserDetails();
if (!user.user.hasActiveSessionKey) {
console.log("Session key not active, retrying...");
await sdk.createSessionKey(userAddress, chainId);
const userRetry = await sdk.getUserDetails();
if (!userRetry.user.hasActiveSessionKey) {
throw new Error("Session key activation failed. Contact support.");
}
}
// Deposit 100 USDC
await sdk.depositFunds(userAddress, chainId, "100000000");
console.log("Deposited! Now earning yield.");
await sdk.disconnectAccount();
}
async function withdrawYield(userAddress: string, privateKey: string, amount?: string) {
const sdk = new ZyfaiSDK({ apiKey: process.env.ZYFAI_API_KEY! });
const chainId = 8453; // Base
// Connect using the agent's private key
await sdk.connectAccount(privateKey, chainId);
// Withdraw funds (pass EOA as userAddress)
if (amount) {
// Partial withdrawal
await sdk.withdrawFunds(userAddress, chainId, amount);
console.log(`Withdrawn ${amount} (6 decimals) to EOA`);
} else {
// Full withdrawal
await sdk.withdrawFunds(userAddress, chainId);
console.log("Withdrawn all funds to EOA");
}
await sdk.disconnectAccount();
}
| Method | Params | Description |
|--------|--------|-------------|
| connectAccount | (privateKey, chainId) | Authenticate with Zyfai |
| getSmartWalletAddress | (userAddress, chainId) | Get subaccount address & status |
| deploySafe | (userAddress, chainId, strategy) | Create subaccount |
| createSessionKey | (userAddress, chainId) | Enable auto-optimization |
| depositFunds | (userAddress, chainId, amount) | Deposit USDC (6 decimals) |
| withdrawFunds | (userAddress, chainId, amount?) | Withdraw (all if no amount) |
| getPositions | (userAddress, chainId?) | Get active DeFi positions |
| getAvailableProtocols | (chainId) | Get available protocols & pools |
| getAPYPerStrategy | (crossChain?, days?, strategyType?) | Get APY for conservative/aggressive strategies |
| getUserDetails | () | Get authenticated user details |
| getOnchainEarnings | (walletAddress) | Get earnings data |
| updateUserProfile | (params) | Update strategy, protocols, splitting, cross-chain settings |
| registerAgentOnIdentityRegistry | (smartWallet, chainId) | Register agent on ERC-8004 Identity Registry |
| disconnectAccount | () | End session |
Note: All methods that take userAddress expect the EOA address, not the subaccount/Safe address.
Get all active DeFi positions for a user across protocols. Optionally filter by chain.
Parameters:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | userAddress | string | ✅ | User's EOA address | | chainId | SupportedChainId | ❌ | Optional: Filter by specific chain ID |
Example:
// Get all positions across all chains
const positions = await sdk.getPositions("0xUser...");
// Get positions on Arbitrum only
const arbPositions = await sdk.getPositions("0xUser...", 42161);
Returns:
interface PositionsResponse {
success: boolean;
userAddress: string;
positions: Position[];
}
Get available DeFi protocols and pools for a specific chain with APY data.
const protocols = await sdk.getAvailableProtocols(42161); // Arbitrum
protocols.protocols.forEach((protocol) => {
console.log(`${protocol.name} (ID: ${protocol.id})`);
if (protocol.pools) {
protocol.pools.forEach((pool) => {
console.log(` Pool: ${pool.name} - APY: ${pool.apy || "N/A"}%`);
});
}
});
Returns:
interface ProtocolsResponse {
success: boolean;
chainId: SupportedChainId;
protocols: Protocol[];
}
Get current authenticated user details including smart wallet, chains, protocols, and settings. Requires SIWE authentication.
await sdk.connectAccount(privateKey, chainId);
const user = await sdk.getUserDetails();
console.log("Smart Wallet:", user.user.smartWallet);
console.log("Chains:", user.user.chains);
console.log("Has Active Session:", user.user.hasActiveSessionKey);
Returns:
interface UserDetailsResponse {
success: boolean;
user: {
id: string;
address: string;
smartWallet?: string;
chains: number[];
protocols: Protocol[];
hasActiveSessionKey: boolean;
email?: string;
strategy?: string;
telegramId?: string;
walletType?: string;
autoSelectProtocols: boolean;
autocompounding?: boolean;
omniAccount?: boolean;
crosschainStrategy?: boolean;
agentName?: string;
customization?: Record<string, string[]>;
};
}
Update the authenticated user's profile settings including strategy, protocols, splitting, and cross-chain options. Requires SIWE authentication.
sdk.updateUserProfile(params: UpdateUserProfileRequest): Promise<UpdateUserProfileResponse>
Parameters:
interface UpdateUserProfileRequest {
/** Investment strategy: "conservative" for safer yields, "aggressive" for higher risk/reward */
strategy?: "conservative" | "aggressive";
/** Array of protocol IDs to use for yield optimization */
protocols?: string[];
/** Enable omni-account feature for cross-chain operations */
omniAccount?: boolean;
/** Enable automatic compounding of earned yields (default: true) */
autocompounding?: boolean;
/** Custom name for your agent */
agentName?: string;
/** Enable cross-chain strategy execution */
crosschainStrategy?: boolean;
/** Enable position splitting across multiple protocols */
splitting?: boolean;
/** Minimum number of splits when position splitting is enabled (1-4) */
minSplits?: number;
}
Returns:
interface UpdateUserProfileResponse {
success: boolean;
userId: string;
smartWallet?: string;
chains?: number[];
strategy?: string;
protocols?: string[];
omniAccount?: boolean;
autocompounding?: boolean;
agentName?: string;
crosschainStrategy?: boolean;
executorProxy?: boolean;
splitting?: boolean;
minSplits?: number;
}
Examples:
// Update strategy from conservative to aggressive
await sdk.updateUserProfile({
strategy: "aggressive",
});
// Configure specific protocols
const protocolsResponse = await sdk.getAvailableProtocols(8453);
const selectedProtocols = protocolsResponse.protocols
.filter(p => ["Aave", "Compound", "Moonwell"].includes(p.name))
.map(p => p.id);
await sdk.updateUserProfile({
protocols: selectedProtocols,
});
// Enable position splitting (distribute across multiple protocols)
await sdk.updateUserProfile({
splitting: true,
minSplits: 3, // Split across at least 3 protocols
});
// Verify changes
const userDetails = await sdk.getUserDetails();
console.log("Strategy:", userDetails.user.strategy);
console.log("Splitting:", userDetails.user.splitting);
Cross-chain strategies: Only enable cross-chain when the user explicitly requests it. For cross-chain to work, both
crosschainStrategyandomniAccountmust be set totrue. Never enable cross-chain settings by default.
// Enable cross-chain ONLY when explicitly requested by the user
await sdk.updateUserProfile({
crosschainStrategy: true,
omniAccount: true,
});
// Now funds can be rebalanced across configured chains
const user = await sdk.getUserDetails();
console.log("Operating on chains:", user.user.chains);
Notes:
getAvailableProtocols(chainId) to get valid protocol IDs before updating.minSplits is set to 2, 3, or 4, funds are always distributed across at least that many pools for improved risk diversification (up to 4 DeFi pools). This guarantees your funds will be split regardless of market conditions.crosschainStrategy: true AND omniAccount: true. Only activate when the user explicitly asks for cross-chain yield optimization. Chains are configured during initial setup and cannot be changed via this method.true, yields are reinvested automatically.executorProxy cannot be updated via this method.Get global APY by strategy type (conservative or aggressive), time period, and chain configuration. Use this to compare expected returns between strategies before deploying.
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| crossChain | boolean | ❌ | If true, returns APY for cross-chain strategies; if false, single-chain |
| days | number | ❌ | Period over which APY is calculated. One of 7, 15, 30, 60 |
| strategyType | string | ❌ | Strategy risk profile. One of 'conservative' or 'aggressive' |
Example:
// Get 7-day APY for conservative single-chain strategy
const conservativeApy = await sdk.getAPYPerStrategy(false, 7, 'conservative');
console.log("Conservative APY:", conservativeApy.data);
// Get 30-day APY for aggressive cross-chain strategy
const aggressiveApy = await sdk.getAPYPerStrategy(true, 30, 'aggressive');
console.log("Aggressive APY:", aggressiveApy.data);
// Compare strategies
const conservative = await sdk.getAPYPerStrategy(false, 30, 'conservative');
const aggressive = await sdk.getAPYPerStrategy(false, 30, 'aggressive');
console.log(`Conservative 30d APY: ${conservative.data[0]?.apy}%`);
console.log(`Aggressive 30d APY: ${aggressive.data[0]?.apy}%`);
Returns:
interface APYPerStrategyResponse {
success: boolean;
count: number;
data: APYPerStrategy[];
}
interface APYPerStrategy {
strategyType: string;
apy: number;
period: number;
crossChain: boolean;
}
Get onchain earnings for a wallet including total, current, and lifetime earnings.
const earnings = await sdk.getOnchainEarnings(smartWalletAddress);
console.log("Total earnings:", earnings.data.totalEarnings);
console.log("Current earnings:", earnings.data.currentEarnings);
console.log("Lifetime earnings:", earnings.data.lifetimeEarnings);
Returns:
interface OnchainEarningsResponse {
success: boolean;
data: {
walletAddress: string;
totalEarnings: number;
currentEarnings: number;
lifetimeEarnings: number;
unrealizedEarnings?: number;
currentEarningsByChain?: Record<string, number>;
unrealizedEarningsByChain?: Record<string, number>;
lastCheckTimestamp?: string;
};
}
Register your Zyfai deployed agent on the Identity Registry following the ERC-8004 standard. This is used for OpenClaw agent registration. The method fetches a tokenUri containing the agent's metadata stored on IPFS, then registers it on-chain.
Supported Chains:
| Chain | Chain ID | |-------|----------| | Base | 8453 | | Arbitrum | 42161 |
Parameters:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | smartWallet | string | ✅ | The Zyfai deployed smart wallet address to register as an agent | | chainId | SupportedChainId | ✅ | Chain ID (only 8453 or 42161) |
Example:
const sdk = new ZyfaiSDK({ apiKey: "your-api-key" });
await sdk.connectAccount(privateKey, 8453);
// Get smart wallet address
const walletInfo = await sdk.getSmartWalletAddress(userAddress, 8453);
const smartWallet = walletInfo.address;
// Register agent on Identity Registry
const result = await sdk.registerAgentOnIdentityRegistry(smartWallet, 8453);
console.log("Registration successful:");
console.log(" Tx Hash:", result.txHash);
console.log(" Chain ID:", result.chainId);
console.log(" Smart Wallet:", result.smartWallet);
Returns:
interface RegisterAgentResponse {
success: boolean;
txHash: string;
chainId: number;
smartWallet: string;
}
How It Works:
tokenUri from the Zyfai API (agent metadata stored on IPFS)register(tokenUri) call for the Identity Registry contractThe subaccount address should be identical across all chains for the same EOA. If you see different addresses:
// Check addresses on both chains
const baseWallet = await sdk.getSmartWalletAddress(userAddress, 8453);
const arbWallet = await sdk.getSmartWalletAddress(userAddress, 42161);
if (baseWallet.address !== arbWallet.address) {
console.error("Address mismatch! Contact support.");
}
If addresses don't match:
This means the wallet isn't registered in the backend. Solution:
deploySafe() first — even if the Safe is already deployed on-chain, this registers it with the backendcreateSessionKey()This typically means:
Verify you're using the correct private key for the EOA.
POST /api/sdk-api-keys/createFile v1.0.7:_meta.json
{ "ownerId": "kn788ynsr62y24k11bfmrtc9ph80cvdh", "slug": "zyfai-sdk", "version": "1.0.7", "publishedAt": 1771435176338 }
Machine endpoints, contract coverage, trust signals, runtime metrics, benchmarks, and guardrails for agent-to-agent use.
Machine interfaces
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/snapshot"
curl -s "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/contract"
curl -s "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/trust"
Operational fit
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Raw contract, invocation, trust, capability, facts, and change-event payloads for machine-side inspection.
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "CLAWHUB",
"generatedAt": "2026-04-17T05:29:52.517Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile"
}Facts JSON
[
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceUrl": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.9K downloads",
"href": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceUrl": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.0.8",
"href": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceUrl": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-19T17:36:35.942Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-pauldefi-zyfai-sdk/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "release",
"title": "Release 1.0.8",
"description": "- Added support for connecting to Zyfai using a wallet provider (e.g., MetaMask), a viem WalletClient, or a raw private key. - Updated documentation to recommend secure wallet connection methods, including integration with AWS KMS, GCP, Turnkey, Privy, or other Wallet-as-a-Service solutions for production. - Added explicit security guidance and a comparison table for connection options. - Clarified instructions and examples for connecting via wallet providers, WalletClients, and private keys. - No functional changes to SDK logic; documentation improvements only. - Added .DS_Store file (no effect on functionality).",
"href": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceUrl": "https://clawhub.ai/PaulDeFi/zyfai-sdk",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-19T17:36:35.942Z",
"isPublic": true
}
]Sponsored
Ads related to Zyfai Yield Automation and adjacent AI workflows.