starkzap-sdk
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseStarkzap SDK
Starkzap SDK
Project-focused guide for .
https://github.com/keep-starknet-strange/starkzapUse this skill when requests involve Starkzap SDK code, examples, or docs.
这是针对的项目专属指南。
https://github.com/keep-starknet-strange/starkzap当需求涉及Starkzap SDK代码、示例或文档时,可使用本技能。
When To Use
适用场景
Trigger for tasks like:
- "Add a new onboarding flow in Starkzap"
- "Fix sponsored transaction behavior in wallet.execute"
- "Update staking pool logic or validator presets"
- "Patch Privy signer/server integration"
- "Review Starkzap tests/docs/examples"
触发以下类型任务时使用:
- "在Starkzap中添加新的用户引导流程"
- "修复wallet.execute中的赞助交易行为"
- "更新质押池逻辑或验证节点预设"
- "修复Privy签名器/服务器集成问题"
- "审核Starkzap的测试/文档/示例"
Repository Map
仓库结构
Primary implementation:
- - top-level orchestration (
src/sdk.ts)StarkSDK - - wallet implementations and lifecycle
src/wallet/* - -
src/signer/*,StarkSigner, signer adapterPrivySigner - -
src/tx/*andTxTxBuilder - - token helpers, balance/transfer logic
src/erc20/* - - staking operations and pool discovery
src/staking/* - - shared domain types (
src/types/*,Address, config)Amount
Operational and docs:
- and
tests/*tests/integration/* - ,
examples/web,examples/server,examples/mobileexamples/flappy-bird - for generated artifacts in the Starkzap repo
scripts/* - and
docs/*mintlify-docs/*
Skill resources:
- - signer trust boundaries and auth assumptions
skills/starkzap-sdk/references/signer-integration.md - - paymaster flow and fee mode behavior
skills/starkzap-sdk/references/sponsored-transactions.md - -
skills/starkzap-sdk/references/erc20-helpers.mdsemantics and transfer patternsAmount - - pool discovery and timeout/abort safety
skills/starkzap-sdk/references/staking-reliability.md - - wallet readiness and execute flow
skills/starkzap-sdk/scripts/wallet-execute-example.ts - - staking pool discovery and diagnostics
skills/starkzap-sdk/scripts/staking-pool-discovery.ts
核心实现文件:
- - 顶层编排逻辑(
src/sdk.ts)StarkSDK - - 钱包实现及生命周期管理
src/wallet/* - -
src/signer/*、StarkSigner、签名器适配器PrivySigner - -
src/tx/*和TxTxBuilder - - 代币工具类、余额/转账逻辑
src/erc20/* - - 质押操作及质押池发现逻辑
src/staking/* - - 共享领域类型(
src/types/*、Address、配置项)Amount
运维与文档相关:
- 和
tests/*tests/integration/* - 、
examples/web、examples/server、examples/mobileexamples/flappy-bird - 用于生成Starkzap仓库中的制品
scripts/* - 和
docs/*mintlify-docs/*
技能相关资源:
- - 签名器信任边界与认证假设
skills/starkzap-sdk/references/signer-integration.md - - Paymaster流程与费用模式行为
skills/starkzap-sdk/references/sponsored-transactions.md - -
skills/starkzap-sdk/references/erc20-helpers.md语义与转账模式Amount - - 质押池发现与超时/终止安全机制
skills/starkzap-sdk/references/staking-reliability.md - - 钱包就绪状态与执行流程
skills/starkzap-sdk/scripts/wallet-execute-example.ts - - 质押池发现与诊断逻辑
skills/starkzap-sdk/scripts/staking-pool-discovery.ts
Quick Reference
快速参考
Common starknet.js patterns (provider/account/call/execute/listen):
typescript
import { Account, Contract, RpcProvider } from "starknet";
const provider = await RpcProvider.create({
nodeUrl: process.env.RPC_URL!,
});
const account = new Account({
provider,
address: process.env.ACCOUNT_ADDRESS!,
signer: process.env.PRIVATE_KEY!,
cairoVersion: "1",
});
const contract = new Contract({
abi,
address: process.env.CONTRACT_ADDRESS!,
providerOrAccount: account,
});
await contract.call("balance_of", [account.address]); // read
const tx = await account.execute([
{
contractAddress: process.env.CONTRACT_ADDRESS!,
entrypoint: "do_work",
calldata: [],
},
]);
await provider.waitForTransaction(tx.transaction_hash);typescript
// With Starkzap Tx wrapper
const submitted = await wallet.execute(calls, { feeMode: "user_pays" });
const stop = submitted.watch(
({ finality, execution }) => console.log(finality, execution),
{ pollIntervalMs: 5000, timeoutMs: 120000 }
);
// stop(); // call to unsubscribe earlyCommon error classes and immediate recovery:
| Error Class | Typical Signal | Immediate Recovery |
|---|---|---|
| | Re-check token decimals/symbol, parse from known token preset, avoid mixing token types. |
| | Run |
| timeout, 429, provider mismatch | Retry with backoff, confirm |
| | Run |
| Privy 401/403, invalid signature response | Verify signer server auth, headers/body resolver, and trusted |
See also:
- for implementation-specific troubleshooting
skills/starkzap-sdk/references/* - for runnable diagnostic examples
skills/starkzap-sdk/scripts/*
常见starknet.js模式(provider/account/call/execute/listen):
typescript
import { Account, Contract, RpcProvider } from "starknet";
const provider = await RpcProvider.create({
nodeUrl: process.env.RPC_URL!,
});
const account = new Account({
provider,
address: process.env.ACCOUNT_ADDRESS!,
signer: process.env.PRIVATE_KEY!,
cairoVersion: "1",
});
const contract = new Contract({
abi,
address: process.env.CONTRACT_ADDRESS!,
providerOrAccount: account,
});
await contract.call("balance_of", [account.address]); // 读取操作
const tx = await account.execute([
{
contractAddress: process.env.CONTRACT_ADDRESS!,
entrypoint: "do_work",
calldata: [],
},
]);
await provider.waitForTransaction(tx.transaction_hash);typescript
// 使用Starkzap Tx包装器
const submitted = await wallet.execute(calls, { feeMode: "user_pays" });
const stop = submitted.watch(
({ finality, execution }) => console.log(finality, execution),
{ pollIntervalMs: 5000, timeoutMs: 120000 }
);
// stop(); // 提前取消订阅时调用常见错误类与即时恢复方案:
| 错误类 | 典型标识 | 即时恢复方案 |
|---|---|---|
| | 重新检查代币小数位数/符号,从已知代币预设中解析,避免混合不同代币类型。 |
| 调用 | 在执行 |
| 超时、429错误、Provider不匹配 | 带退避策略重试,确认 |
| | 先执行 |
| Privy 401/403错误、无效签名响应 | 验证签名器服务器认证信息、请求头/请求体解析逻辑,以及可信 |
更多参考:
- 针对实现细节的故障排查
skills/starkzap-sdk/references/* - 可运行的诊断示例
skills/starkzap-sdk/scripts/*
Core Workflows
核心工作流
1) Configure StarkSDK
and Connect Wallets
StarkSDK1) 配置StarkSDK
并连接钱包
StarkSDKCommon API path:
- Instantiate with
StarkSDKornetwork.rpcUrl + chainId - Use or
sdk.onboard(...).sdk.connectWallet(...) - Call before user-pays writes.
wallet.ensureReady({ deploy: "if_needed" })
Supported onboarding strategies:
OnboardStrategy.SignerOnboardStrategy.PrivyOnboardStrategy.Cartridge
For Cartridge:
- Treat as web-only runtime.
- Expect popup/session behavior and policy scoping requirements.
typescript
import {
ChainId,
OnboardStrategy,
StarkSDK,
StarkSigner,
} from "starkzap";
const sdk = new StarkSDK({ network: "sepolia" });
const customSdk = new StarkSDK({
rpcUrl: process.env.RPC_URL!,
chainId: ChainId.SEPOLIA,
});
const signerResult = await sdk.onboard({
strategy: OnboardStrategy.Signer,
account: { signer: new StarkSigner(process.env.PRIVATE_KEY!) },
feeMode: "user_pays",
deploy: "if_needed",
});
const privyResult = await sdk.onboard({
strategy: OnboardStrategy.Privy,
privy: {
resolve: async () => ({
walletId: process.env.PRIVY_WALLET_ID!,
publicKey: process.env.PRIVY_PUBLIC_KEY!,
serverUrl: process.env.PRIVY_SIGNER_URL!,
}),
},
feeMode: "sponsored",
});
const cartridgeResult = await sdk.onboard({
strategy: OnboardStrategy.Cartridge,
cartridge: {
preset: "controller",
policies: [{ target: "0xPOOL", method: "stake" }],
},
});
const wallet = await sdk.connectWallet({
account: { signer: new StarkSigner(process.env.PRIVATE_KEY!) },
feeMode: "sponsored",
});
await wallet.ensureReady({ deploy: "if_needed" });通用API流程:
- 使用或
network实例化rpcUrl + chainId。StarkSDK - 调用或
sdk.onboard(...)。sdk.connectWallet(...) - 在执行用户付费的写入操作前,调用。
wallet.ensureReady({ deploy: "if_needed" })
支持的用户引导策略:
OnboardStrategy.SignerOnboardStrategy.PrivyOnboardStrategy.Cartridge
关于Cartridge:
- 仅支持Web运行时。
- 需注意弹窗/会话行为及策略范围要求。
typescript
import {
ChainId,
OnboardStrategy,
StarkSDK,
StarkSigner,
} from "starkzap";
const sdk = new StarkSDK({ network: "sepolia" });
const customSdk = new StarkSDK({
rpcUrl: process.env.RPC_URL!,
chainId: ChainId.SEPOLIA,
});
const signerResult = await sdk.onboard({
strategy: OnboardStrategy.Signer,
account: { signer: new StarkSigner(process.env.PRIVATE_KEY!) },
feeMode: "user_pays",
deploy: "if_needed",
});
const privyResult = await sdk.onboard({
strategy: OnboardStrategy.Privy,
privy: {
resolve: async () => ({
walletId: process.env.PRIVY_WALLET_ID!,
publicKey: process.env.PRIVY_PUBLIC_KEY!,
serverUrl: process.env.PRIVY_SIGNER_URL!,
}),
},
feeMode: "sponsored",
});
const cartridgeResult = await sdk.onboard({
strategy: OnboardStrategy.Cartridge,
cartridge: {
preset: "controller",
policies: [{ target: "0xPOOL", method: "stake" }],
},
});
const wallet = await sdk.connectWallet({
account: { signer: new StarkSigner(process.env.PRIVATE_KEY!) },
feeMode: "sponsored",
});
await wallet.ensureReady({ deploy: "if_needed" });2) Execute Transactions (wallet.execute
, wallet.preflight
, wallet.tx
)
wallet.executewallet.preflightwallet.tx2) 执行交易(wallet.execute
、wallet.preflight
、wallet.tx
)
wallet.executewallet.preflightwallet.txUse:
- for direct execution.
wallet.execute(calls, options) - for simulation checks.
wallet.preflight({ calls, feeMode }) - (
wallet.tx()) for batched operations with deterministic ordering.TxBuilder
typescript
const calls = [
{
contractAddress: process.env.CONTRACT_ADDRESS!,
entrypoint: "do_work",
calldata: [],
},
];
const preflight = await wallet.preflight({
calls,
feeMode: "user_pays",
});
if (!preflight.ok) {
throw new Error(`Preflight failed: ${preflight.reason}`);
}
const userPaysTx = await wallet.execute(calls, { feeMode: "user_pays" });
await userPaysTx.wait();
const sponsoredTx = await wallet.execute(calls, { feeMode: "sponsored" });
await sponsoredTx.wait();
const batchedTx = await wallet
.tx()
.add(...calls)
.send({ feeMode: "sponsored" });
await batchedTx.wait();typescript
function getSdkErrorClass(error: unknown): string {
const message = error instanceof Error ? error.message : String(error);
if (message.includes("not deployed")) return "UNDEPLOYED_ACCOUNT";
if (message.includes("timed out") || message.includes("429")) {
return "RPC_OR_NETWORK";
}
if (message.includes("signature") || message.includes("Privy")) {
return "AUTH_OR_PERMISSION";
}
if (message.includes("Invalid") || message.includes("Amount")) {
return "VALIDATION_ERROR";
}
return "UNKNOWN";
}
try {
await wallet.execute(calls, { feeMode: "user_pays" });
} catch (error) {
const kind = getSdkErrorClass(error);
if (kind === "UNDEPLOYED_ACCOUNT") {
await wallet.ensureReady({ deploy: "if_needed" });
}
throw error;
}When changing execution behavior:
- Audit deploy vs execute path for undeployed accounts.
- Verify runtime constraints (is web-only).
OnboardStrategy.Cartridge - Cover both and
user_paysbranches in tests.sponsored
使用场景:
- 用于直接执行交易。
wallet.execute(calls, options) - 用于模拟检查。
wallet.preflight({ calls, feeMode }) - (
wallet.tx())用于确定性排序的批量操作。TxBuilder
typescript
const calls = [
{
contractAddress: process.env.CONTRACT_ADDRESS!,
entrypoint: "do_work",
calldata: [],
},
];
const preflight = await wallet.preflight({
calls,
feeMode: "user_pays",
});
if (!preflight.ok) {
throw new Error(`预检查失败: ${preflight.reason}`);
}
const userPaysTx = await wallet.execute(calls, { feeMode: "user_pays" });
await userPaysTx.wait();
const sponsoredTx = await wallet.execute(calls, { feeMode: "sponsored" });
await sponsoredTx.wait();
const batchedTx = await wallet
.tx()
.add(...calls)
.send({ feeMode: "sponsored" });
await batchedTx.wait();typescript
function getSdkErrorClass(error: unknown): string {
const message = error instanceof Error ? error.message : String(error);
if (message.includes("not deployed")) return "UNDEPLOYED_ACCOUNT";
if (message.includes("timed out") || message.includes("429")) {
return "RPC_OR_NETWORK";
}
if (message.includes("signature") || message.includes("Privy")) {
return "AUTH_OR_PERMISSION";
}
if (message.includes("Invalid") || message.includes("Amount")) {
return "VALIDATION_ERROR";
}
return "UNKNOWN";
}
try {
await wallet.execute(calls, { feeMode: "user_pays" });
} catch (error) {
const kind = getSdkErrorClass(error);
if (kind === "UNDEPLOYED_ACCOUNT") {
await wallet.ensureReady({ deploy: "if_needed" });
}
throw error;
}修改执行行为时:
- 审核未部署账户的部署与执行路径。
- 验证运行时约束(仅支持Web环境)。
OnboardStrategy.Cartridge - 测试中覆盖和
user_pays两种分支。sponsored
3) ERC20 and Staking Scope
3) ERC20与质押范围
ERC20 notes (starkzap-sdk internal token operations, no avnu required):
- Validate with the token preset used for the call.
Amount - Keep multicall ordering explicit for batched transfers.
typescript
import { Amount } from "starkzap";
const usdcAmount = Amount.parse("25", USDC);
try {
const tx = await wallet
.tx()
.transfer(USDC, [
{ to: recipientA, amount: usdcAmount },
{ to: recipientB, amount: Amount.parse("5", USDC) },
])
.send({ feeMode: "user_pays" });
await tx.wait();
} catch (error) {
// Re-parse Amount from the expected token preset before retrying.
throw error;
}Staking notes (starkzap-specific staking flows):
- Membership-sensitive operations: ,
enter,add,exit intent.exit - Validate staking config and chain presets before execution.
- Verify timeout/abort behavior where pool resolution is involved.
For general DeFi operations (swaps, DCA, lending) and STRK staking via the avnu aggregator, use the skill.
starknet-defiERC20注意事项(starkzap-sdk内部代币操作,无需avnu):
- 使用调用对应的代币预设验证。
Amount - 批量转账时明确多调用的顺序。
typescript
import { Amount } from "starkzap";
const usdcAmount = Amount.parse("25", USDC);
try {
const tx = await wallet
.tx()
.transfer(USDC, [
{ to: recipientA, amount: usdcAmount },
{ to: recipientB, amount: Amount.parse("5", USDC) },
])
.send({ feeMode: "user_pays" });
await tx.wait();
} catch (error) {
// 重试前从预期的代币预设重新解析Amount。
throw error;
}质押注意事项(Starkzap专属质押流程):
- 成员敏感操作:、
enter、add、exit intent。exit - 执行前验证质押配置和链预设。
- 涉及质押池解析时,验证超时/终止行为。
对于通用DeFi操作(兑换、DCA、借贷)及通过avnu聚合器进行的STRK质押,请使用技能。
starknet-defi4) Examples + Integration Surfaces
4) 示例与集成面
Check for drift between:
examples/web/main.tsexamples/server/server.ts- and docs links
README
Specifically verify endpoint and auth consistency for Privy + paymaster proxy flows.
检查以下文件间的差异:
examples/web/main.tsexamples/server/server.ts- 及文档链接
README
特别验证Privy + Paymaster代理流程的端点和认证一致性。
Guardrails
防护规则
Do not hand-edit generated files:
src/erc20/token/presets.tssrc/erc20/token/presets.sepolia.tssrc/staking/validator/presets.tssrc/staking/validator/presets.sepolia.tsdocs/api/**docs/export/**
Regenerate with scripts:
bash
npm run generate:tokens
npm run generate:tokens:sepolia
npm run generate:validators
npm run generate:validators:sepolia
npm run docs:api
npm run docs:exportKeep API export changes explicit:
- If new public API is added/removed, update .
src/index.ts
请勿手动编辑生成的文件:
src/erc20/token/presets.tssrc/erc20/token/presets.sepolia.tssrc/staking/validator/presets.tssrc/staking/validator/presets.sepolia.tsdocs/api/**docs/export/**
通过脚本重新生成:
bash
npm run generate:tokens
npm run generate:tokens:sepolia
npm run generate:validators
npm run generate:validators:sepolia
npm run docs:api
npm run docs:export明确API导出变更:
- 若添加/移除新的公共API,需更新。
src/index.ts
Validation Checklist
验证检查清单
Run minimal set first:
bash
npm run typecheck
npm testRun broader checks when behavior is cross-cutting:
bash
npm run build
npm run test:allIntegration tests may require local devnet/fork setup:
bash
npm run test:integrationIf not run, clearly report why.
先运行最小集检查:
bash
npm run typecheck
npm test当行为涉及跨模块时,运行更全面的检查:
bash
npm run build
npm run test:all集成测试可能需要本地devnet/分叉环境:
bash
npm run test:integration若未运行,请明确说明原因。
Error Codes & Recovery
错误码与恢复方案
Map observed errors to actionable recovery:
| Error Class | Typical Trigger | Recovery Steps |
|---|---|---|
| | Confirm token decimals/symbol, re-create |
| RPC timeout, | Retry with exponential backoff, check |
| | Run |
| | Increase timeout where appropriate, add abort handling, retry on fresh provider session, avoid parallel heavy queries. |
| Privy signing errors, 401/403, invalid signature payloads | Verify signer server auth headers/body, validate trusted |
| | Run |
| Preset/docs changes diverge from source of truth | Regenerate via |
If a fix is uncertain:
- Reproduce with the closest example in .
examples/* - Capture command, environment, and failing test IDs.
- Report exact file/path + remediation attempted.
将观测到的错误映射到可执行的恢复步骤:
| 错误类 | 典型触发场景 | 恢复步骤 |
|---|---|---|
| | 确认代币小数位数/符号,从已知代币预设重新创建 |
| RPC超时、429错误、临时JSON-RPC失败、链不匹配 | 指数退避策略重试,检查 |
| | 先执行 |
| | 适当增加超时时间,添加终止处理逻辑,在新的Provider会话中重试,避免并行执行重型查询。 |
| Privy签名错误、401/403错误、无效签名负载 | 验证签名器服务器认证头/请求体,验证可信 |
| 对未部署账户执行 | 先调用 |
| 预设/文档变更与源数据不一致 | 通过 |
若不确定修复方案:
- 使用中最接近的示例复现问题。
examples/* - 记录命令、环境及失败测试ID。
- 报告确切文件/路径 + 已尝试的修复措施。
Useful Task Patterns
实用任务模式
-
Bug fix in wallet lifecycle:
- inspect ,
src/wallet/index.tssrc/wallet/utils.ts - patch
- update
tests/wallet*.test.ts
- inspect
-
Privy auth/signature issue:
- inspect
src/signer/privy.ts - align with
examples/server/server.ts - update
tests/privy-signer.test.ts
- inspect
-
Staking regression:
- inspect ,
src/staking/staking.tssrc/staking/presets.ts - add/adjust integration assertions in
tests/integration/staking.test.ts
- inspect
-
钱包生命周期Bug修复:
- 检查、
src/wallet/index.tssrc/wallet/utils.ts - 修复代码
- 更新
tests/wallet*.test.ts
- 检查
-
Privy认证/签名问题:
- 检查
src/signer/privy.ts - 与对齐
examples/server/server.ts - 更新
tests/privy-signer.test.ts
- 检查
-
质押功能回归:
- 检查、
src/staking/staking.tssrc/staking/presets.ts - 在中添加/调整集成断言
tests/integration/staking.test.ts
- 检查
Example Prompt
示例提示
"Use this skill to fix Starkzap sponsored execution for undeployed accounts, add tests, and list behavior changes."
"使用本技能修复Starkzap针对未部署账户的赞助执行问题,添加测试并列出行为变更。"