name: Bankr x402 SDK - 客户端模式 description: 当用户询问“实现Bankr SDK客户端”、“编写bankr-client.ts”、“创建SDK客户端设置”、“SDK项目的通用文件”、“Bankr SDK的package.json”、“Bankr的tsconfig”、“SDK TypeScript模式”、“执行SDK交易”,或需要用于Bankr SDK集成的可重用客户端代码和通用项目文件时,应使用此技能。 version: 1.0.0
x402 SDK 客户端模式
用于Bankr SDK项目的可重用客户端代码和通用文件。
bankr-client.ts
所有Bankr SDK项目的核心SDK客户端模块:
import "dotenv/config";
import { BankrClient } from "@bankr/sdk";
// ============================================
// 验证
// ============================================
if (!process.env.BANKR_PRIVATE_KEY) {
throw new Error(
"BANKR_PRIVATE_KEY环境变量是必需的。" +
"此钱包为每个请求支付0.01 USDC(需要在Base上有USDC)。"
);
}
// ============================================
// 客户端设置
// ============================================
/**
* Bankr SDK 客户端
*
* 提供AI驱动的Web3操作,支持x402微支付。
* 每个API请求成本为0.01 USDC(由Base上的支付钱包支付)。
*
* @example
* ```typescript
* import { bankrClient } from "./bankr-client";
*
* // 代币交换
* const swap = await bankrClient.promptAndWait({
* prompt: "在Base上交换0.1 ETH到USDC",
* });
*
* // 检查余额
* const balances = await bankrClient.promptAndWait({
* prompt: "我的代币余额是什么?",
* });
* ```
*
* @see https://www.npmjs.com/package/@bankr/sdk
*/
export const bankrClient = new BankrClient({
// 必需:支付钱包私钥
// 此钱包为每个API请求支付0.01 USDC(必须在Base上有USDC)
privateKey: process.env.BANKR_PRIVATE_KEY as `0x${string}`,
// 可选:覆盖接收钱包地址
// 如果未设置,代币将发送到支付钱包地址
walletAddress: process.env.BANKR_WALLET_ADDRESS,
// 可选:API端点(默认为生产环境)
...(process.env.BANKR_API_URL && { baseUrl: process.env.BANKR_API_URL }),
});
// 导出钱包地址以供参考
export const walletAddress = bankrClient.getWalletAddress();
// ============================================
// 类型(从SDK重新导出)
// ============================================
export type { JobStatusResponse, Transaction } from "@bankr/sdk";
executor.ts
使用viem的事务执行助手:
import { createWalletClient, http, type WalletClient } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base, mainnet, polygon } from "viem/chains";
import type { Transaction } from "@bankr/sdk";
// 链配置
const chains = {
8453: base,
1: mainnet,
137: polygon,
} as const;
// 创建用于事务执行的钱包客户端
const account = privateKeyToAccount(
process.env.BANKR_PRIVATE_KEY as `0x${string}`
);
function getWalletClient(chainId: number): WalletClient {
const chain = chains[chainId as keyof typeof chains];
if (!chain) {
throw new Error(`不支持的链ID: ${chainId}`);
}
return createWalletClient({
account,
chain,
transport: http(),
});
}
/**
* 执行Bankr SDK返回的事务
*
* @example
* ```typescript
* const result = await bankrClient.promptAndWait({
* prompt: "交换0.1 ETH到USDC",
* });
*
* if (result.transactions?.length) {
* const hash = await executeTransaction(result.transactions[0]);
* console.log("事务:", hash);
* }
* ```
*/
export async function executeTransaction(tx: Transaction): Promise<string> {
const txData = tx.metadata.transaction;
const client = getWalletClient(txData.chainId);
console.log(`在链${txData.chainId}上执行${tx.type}...`);
const hash = await client.sendTransaction({
to: txData.to as `0x${string}`,
data: txData.data as `0x${string}`,
value: BigInt(txData.value || "0"),
gas: BigInt(txData.gas),
});
console.log(`事务已提交: ${hash}`);
return hash;
}
/**
* 执行Bankr结果中的所有事务
*/
export async function executeAllTransactions(
transactions: Transaction[]
): Promise<string[]> {
const hashes: string[] = [];
for (const tx of transactions) {
const hash = await executeTransaction(tx);
hashes.push(hash);
}
return hashes;
}
通用文件
package.json
所有Bankr SDK项目的基础package.json:
{
"name": "{项目名称}",
"version": "0.1.0",
"description": "{描述}",
"type": "module",
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "tsx src/index.ts"
},
"dependencies": {
"@bankr/sdk": "^1.0.0",
"dotenv": "^16.3.1",
"viem": "^2.0.0"
},
"devDependencies": {
"@types/node": "^20.10.0",
"tsx": "^4.7.0",
"typescript": "^5.3.0"
}
}
框架特定依赖
根据项目模板添加:
Web服务(Express):
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"@types/express": "^4.17.21"
}
CLI:
"dependencies": {
"commander": "^12.0.0"
}
tsconfig.json
TypeScript配置:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
.env.example
环境变量模板:
# Bankr SDK 配置
# 参见:https://docs.bankr.bot
# 必需:支付钱包私钥
# 此钱包为每个API请求支付0.01 USDC(必须在Base上有USDC)
# 格式:64位十六进制字符,带0x前缀
BANKR_PRIVATE_KEY=0x
# 可选:接收钱包地址
# 交换/购买得到的代币发送到此地址。如果未设置,默认为支付钱包地址。
# BANKR_WALLET_ADDRESS=0x
# 可选:API端点覆盖(默认为https://api.bankr.bot)
# BANKR_API_URL=https://api.bankr.bot
.gitignore
标准忽略模式:
# 依赖项
node_modules/
# 构建输出
dist/
# 环境变量
.env
.env.local
.env.*.local
# 日志
*.log
npm-debug.log*
# IDE
.idea/
.vscode/
*.swp
*.swo
# 操作系统
.DS_Store
Thumbs.db
# 测试
coverage/
使用模式
基本使用
import { bankrClient } from "./bankr-client";
const result = await bankrClient.promptAndWait({
prompt: "ETH的价格是什么?",
onStatusUpdate: (msg) => console.log("进度:", msg),
});
console.log(result.response);
带事务执行
import { bankrClient } from "./bankr-client";
import { executeTransaction } from "./executor";
const result = await bankrClient.promptAndWait({
prompt: "在Base上交换0.1 ETH到USDC",
});
if (result.status === "completed" && result.transactions?.length) {
// 执行前检查
console.log("事务已就绪:", result.transactions[0].type);
console.log("详细信息:", result.transactions[0].metadata.__ORIGINAL_TX_DATA__);
// 执行
const hash = await executeTransaction(result.transactions[0]);
console.log("已执行:", hash);
}
带错误处理
import { bankrClient } from "./bankr-client";
import { executeAllTransactions } from "./executor";
async function performSwap(prompt: string) {
try {
const result = await bankrClient.promptAndWait({
prompt,
onStatusUpdate: console.log,
});
if (result.status === "completed") {
console.log("成功:", result.response);
if (result.transactions?.length) {
const hashes = await executeAllTransactions(result.transactions);
console.log("事务:", hashes);
}
} else if (result.status === "failed") {
console.error("失败:", result.error);
}
} catch (error) {
console.error("错误:", error.message);
}
}
查询无事务
import { bankrClient } from "./bankr-client";
// 余额查询不返回事务
const balances = await bankrClient.promptAndWait({
prompt: "我在Base上的余额是什么?",
});
console.log(balances.response);
// 价格查询
const price = await bankrClient.promptAndWait({
prompt: "DEGEN的价格",
});
console.log(price.response);
SDK参考
咨询sdk-capabilities技能以获取:
- 完整操作参考
- 支持的链和代币
- 每个操作的示例提示
咨询sdk-token-swaps技能以获取:
- 交换模式和批准处理
- 事务执行详细信息