@swarmvault/sdk 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +12 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -3
- package/dist/index.d.ts +33 -3
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -126,11 +126,14 @@ var SwarmVaultClient = class {
|
|
|
126
126
|
* **Manager only** - requires authentication as a swarm manager.
|
|
127
127
|
*
|
|
128
128
|
* @param swarmId - The swarm ID
|
|
129
|
+
* @param options - Optional settings
|
|
130
|
+
* @param options.includeMembers - Include per-member balances in the response
|
|
129
131
|
* @returns Aggregated holdings with ETH balance, token balances, and common tokens
|
|
130
132
|
* @throws {SwarmVaultError} If not authorized or swarm not found
|
|
131
133
|
*/
|
|
132
|
-
async getSwarmHoldings(swarmId) {
|
|
133
|
-
|
|
134
|
+
async getSwarmHoldings(swarmId, options) {
|
|
135
|
+
const queryParams = options?.includeMembers ? "?includeMembers=true" : "";
|
|
136
|
+
return this.request("GET", `/api/swarms/${swarmId}/holdings${queryParams}`);
|
|
134
137
|
}
|
|
135
138
|
// ===========================================================================
|
|
136
139
|
// Swaps
|
|
@@ -168,7 +171,8 @@ var SwarmVaultClient = class {
|
|
|
168
171
|
sellToken: params.sellToken,
|
|
169
172
|
buyToken: params.buyToken,
|
|
170
173
|
sellPercentage: params.sellPercentage ?? 100,
|
|
171
|
-
slippagePercentage: params.slippagePercentage ?? 1
|
|
174
|
+
slippagePercentage: params.slippagePercentage ?? 1,
|
|
175
|
+
...params.membershipIds && { membershipIds: params.membershipIds }
|
|
172
176
|
});
|
|
173
177
|
}
|
|
174
178
|
/**
|
|
@@ -211,7 +215,8 @@ var SwarmVaultClient = class {
|
|
|
211
215
|
sellToken: params.sellToken,
|
|
212
216
|
buyToken: params.buyToken,
|
|
213
217
|
sellPercentage: params.sellPercentage ?? 100,
|
|
214
|
-
slippagePercentage: params.slippagePercentage ?? 1
|
|
218
|
+
slippagePercentage: params.slippagePercentage ?? 1,
|
|
219
|
+
...params.membershipIds && { membershipIds: params.membershipIds }
|
|
215
220
|
});
|
|
216
221
|
}
|
|
217
222
|
// ===========================================================================
|
|
@@ -248,11 +253,12 @@ var SwarmVaultClient = class {
|
|
|
248
253
|
* });
|
|
249
254
|
* ```
|
|
250
255
|
*/
|
|
251
|
-
async executeTransaction(swarmId,
|
|
256
|
+
async executeTransaction(swarmId, templateOrParams) {
|
|
257
|
+
const body = "template" in templateOrParams ? templateOrParams : { template: templateOrParams };
|
|
252
258
|
return this.request(
|
|
253
259
|
"POST",
|
|
254
260
|
`/api/swarms/${swarmId}/transactions`,
|
|
255
|
-
|
|
261
|
+
body
|
|
256
262
|
);
|
|
257
263
|
}
|
|
258
264
|
/**
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Swarm Vault SDK Types\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface User {\n id: string;\n walletAddress: string;\n twitterId: string | null;\n twitterUsername: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Swarm {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n manager?: {\n id: string;\n walletAddress: string;\n twitterUsername: string | null;\n };\n memberCount?: number;\n isManager?: boolean;\n}\n\nexport interface SwarmMember {\n id: string;\n swarmId: string;\n userId: string;\n agentWalletAddress: string;\n status: \"ACTIVE\" | \"LEFT\";\n joinedAt: string;\n user?: {\n id: string;\n walletAddress: string;\n };\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport type TransactionStatus = \"PENDING\" | \"PROCESSING\" | \"COMPLETED\" | \"FAILED\";\nexport type TransactionTargetStatus = \"PENDING\" | \"SUBMITTED\" | \"CONFIRMED\" | \"FAILED\";\n\nexport interface Transaction {\n id: string;\n swarmId: string;\n status: TransactionStatus;\n template: TransactionTemplate;\n createdAt: string;\n updatedAt: string;\n targets?: TransactionTarget[];\n}\n\nexport interface TransactionTarget {\n id: string;\n transactionId: string;\n membershipId: string;\n userOpHash: string | null;\n txHash: string | null;\n status: TransactionTargetStatus;\n error: string | null;\n createdAt: string;\n updatedAt: string;\n membership?: {\n agentWalletAddress: string;\n user?: {\n walletAddress: string;\n };\n };\n}\n\nexport interface ABITransactionTemplate {\n mode: \"abi\";\n contractAddress: string;\n abi: unknown[];\n functionName: string;\n args: unknown[];\n value: string;\n}\n\nexport interface RawTransactionTemplate {\n mode: \"raw\";\n contractAddress: string;\n data: string;\n value: string;\n}\n\nexport type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;\n\n// ============================================================================\n// Swap Types\n// ============================================================================\n\nexport interface SwapPreviewParams {\n /** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */\n sellToken: string;\n /** Token address to buy */\n buyToken: string;\n /** Percentage of token balance to sell (1-100, default 100) */\n sellPercentage?: number;\n /** Slippage tolerance percentage (default 1) */\n slippagePercentage?: number;\n}\n\nexport interface SwapExecuteParams extends SwapPreviewParams {}\n\nexport interface SwapMemberPreview {\n membershipId: string;\n userId: string;\n userWalletAddress: string;\n agentWalletAddress: string;\n sellAmount: string;\n buyAmount: string;\n feeAmount?: string;\n estimatedPriceImpact?: number;\n sources?: string[];\n error?: string;\n}\n\nexport interface SwapFeeInfo {\n bps: number;\n percentage: string;\n recipientAddress: string;\n}\n\nexport interface SwapPreviewResult {\n sellToken: string;\n buyToken: string;\n sellPercentage: number;\n slippagePercentage: number;\n members: SwapMemberPreview[];\n totalSellAmount: string;\n totalBuyAmount: string;\n totalFeeAmount?: string;\n successCount: number;\n errorCount: number;\n fee: SwapFeeInfo | null;\n}\n\nexport interface SwapExecuteResult {\n transactionId: string;\n status: \"PENDING\";\n memberCount: number;\n message: string;\n fee: SwapFeeInfo | null;\n}\n\n// ============================================================================\n// Holdings Types\n// ============================================================================\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoUrl?: string;\n}\n\nexport interface TokenHolding extends TokenInfo {\n totalBalance: string;\n holderCount: number;\n}\n\nexport interface SwarmHoldings {\n ethBalance: string;\n tokens: TokenHolding[];\n memberCount: number;\n commonTokens: TokenInfo[];\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n errorCode?: string;\n details?: unknown;\n}\n\n// ============================================================================\n// Client Options\n// ============================================================================\n\nexport interface SwarmVaultClientOptions {\n /** Base URL of the Swarm Vault API (default: https://api.swarmvault.xyz) */\n baseUrl?: string;\n /** API key for authentication (starts with 'svk_') */\n apiKey?: string;\n /** JWT token for authentication (alternative to API key) */\n jwt?: string;\n /** Custom fetch function (for testing or custom implementations) */\n fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n}\n\nexport interface WaitForTransactionOptions {\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\n timeoutMs?: number;\n /** Polling interval in milliseconds (default: 3000 = 3 seconds) */\n pollIntervalMs?: number;\n /** Callback called on each poll with current status */\n onPoll?: (transaction: Transaction) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class SwarmVaultError extends Error {\n public readonly errorCode?: string;\n public readonly statusCode?: number;\n public readonly details?: unknown;\n\n constructor(\n message: string,\n options?: {\n errorCode?: string;\n statusCode?: number;\n details?: unknown;\n }\n ) {\n super(message);\n this.name = \"SwarmVaultError\";\n this.errorCode = options?.errorCode;\n this.statusCode = options?.statusCode;\n this.details = options?.details;\n }\n}\n\n// ============================================================================\n// Common Token Addresses\n// ============================================================================\n\n/** Native ETH address used in swap APIs */\nexport const NATIVE_ETH_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n/** Common token addresses on Base Mainnet */\nexport const BASE_MAINNET_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n USDbC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n cbETH: \"0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22\",\n} as const;\n\n/** Common token addresses on Base Sepolia (testnet) */\nexport const BASE_SEPOLIA_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n} as const;\n","/**\n * Swarm Vault SDK Client\n *\n * A TypeScript client for the Swarm Vault API, enabling managers to execute\n * swaps and transactions on behalf of their swarm members.\n *\n * @example\n * ```typescript\n * import { SwarmVaultClient } from '@swarmvault/sdk';\n *\n * const client = new SwarmVaultClient({\n * apiKey: 'svk_your_api_key_here',\n * });\n *\n * // Get swarm holdings\n * const holdings = await client.getSwarmHoldings('swarm-id');\n *\n * // Execute a swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC\n * buyToken: '0x4200000000000000000000000000000000000006', // WETH\n * sellPercentage: 50,\n * });\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId);\n * ```\n */\n\nimport type {\n ApiResponse,\n Swarm,\n SwarmMember,\n SwarmHoldings,\n SwapPreviewParams,\n SwapPreviewResult,\n SwapExecuteParams,\n SwapExecuteResult,\n Transaction,\n TransactionTemplate,\n User,\n SwarmVaultClientOptions,\n WaitForTransactionOptions,\n} from \"./types.js\";\nimport { SwarmVaultError } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.swarmvault.xyz\";\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\nconst DEFAULT_POLL_INTERVAL_MS = 3000; // 3 seconds\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport class SwarmVaultClient {\n private baseUrl: string;\n private apiKey?: string;\n private jwt?: string;\n private fetchFn: FetchFn;\n\n /**\n * Create a new Swarm Vault client.\n *\n * @param options - Client configuration options\n * @param options.baseUrl - Base URL of the API (default: https://api.swarmvault.xyz)\n * @param options.apiKey - API key for authentication (recommended)\n * @param options.jwt - JWT token for authentication (alternative to API key)\n */\n constructor(options: SwarmVaultClientOptions = {}) {\n this.baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.jwt = options.jwt;\n this.fetchFn = options.fetch || (globalThis.fetch as FetchFn);\n\n if (!this.fetchFn) {\n throw new SwarmVaultError(\n \"fetch is not available. Please provide a fetch implementation or use Node.js 18+.\"\n );\n }\n }\n\n // ===========================================================================\n // Authentication\n // ===========================================================================\n\n /**\n * Set the API key for authentication.\n * API keys start with 'svk_' and can be generated in the Swarm Vault settings.\n *\n * @param apiKey - The API key\n */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n this.jwt = undefined;\n }\n\n /**\n * Set the JWT token for authentication.\n * JWTs are obtained through the SIWE login flow.\n *\n * @param jwt - The JWT token\n */\n setJwt(jwt: string): void {\n this.jwt = jwt;\n this.apiKey = undefined;\n }\n\n /**\n * Get the currently authenticated user.\n *\n * @returns The authenticated user\n * @throws {SwarmVaultError} If not authenticated or request fails\n */\n async getMe(): Promise<User> {\n return this.request<User>(\"GET\", \"/api/auth/me\");\n }\n\n // ===========================================================================\n // Swarms\n // ===========================================================================\n\n /**\n * List all swarms. Returns public swarms for unauthenticated requests,\n * or includes management status for authenticated requests.\n *\n * @returns Array of swarms\n */\n async listSwarms(): Promise<Swarm[]> {\n return this.request<Swarm[]>(\"GET\", \"/api/swarms\");\n }\n\n /**\n * Get details of a specific swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Swarm details\n * @throws {SwarmVaultError} If swarm not found\n */\n async getSwarm(swarmId: string): Promise<Swarm> {\n return this.request<Swarm>(\"GET\", `/api/swarms/${swarmId}`);\n }\n\n /**\n * Get members of a swarm.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Array of swarm members\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmMembers(swarmId: string): Promise<SwarmMember[]> {\n return this.request<SwarmMember[]>(\"GET\", `/api/swarms/${swarmId}/members`);\n }\n\n /**\n * Get aggregate token holdings across all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Aggregated holdings with ETH balance, token balances, and common tokens\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmHoldings(swarmId: string): Promise<SwarmHoldings> {\n return this.request<SwarmHoldings>(\"GET\", `/api/swarms/${swarmId}/holdings`);\n }\n\n // ===========================================================================\n // Swaps\n // ===========================================================================\n\n /**\n * Preview a swap for all swarm members without executing it.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * Use this to see expected amounts before executing a swap.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell (use NATIVE_ETH_ADDRESS for ETH)\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Preview with per-member amounts and totals\n *\n * @example\n * ```typescript\n * const preview = await client.previewSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * slippagePercentage: 1,\n * });\n *\n * console.log(`Total sell: ${preview.totalSellAmount}`);\n * console.log(`Expected buy: ${preview.totalBuyAmount}`);\n * console.log(`Success: ${preview.successCount}, Errors: ${preview.errorCount}`);\n * ```\n */\n async previewSwap(swarmId: string, params: SwapPreviewParams): Promise<SwapPreviewResult> {\n return this.request<SwapPreviewResult>(\"POST\", `/api/swarms/${swarmId}/swap/preview`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n });\n }\n\n /**\n * Execute a swap for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * The swap is executed asynchronously. Use `waitForTransaction` to wait for completion.\n *\n * A platform fee (default 0.5%) is deducted from the buy token amount.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // Execute swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * });\n *\n * console.log(`Transaction started: ${result.transactionId}`);\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId, {\n * onPoll: (t) => console.log(`Status: ${t.status}`),\n * });\n *\n * console.log(`Transaction ${tx.status}`);\n * ```\n */\n async executeSwap(swarmId: string, params: SwapExecuteParams): Promise<SwapExecuteResult> {\n return this.request<SwapExecuteResult>(\"POST\", `/api/swarms/${swarmId}/swap/execute`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n });\n }\n\n // ===========================================================================\n // Transactions\n // ===========================================================================\n\n /**\n * Execute a raw transaction template for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * This is an advanced method for custom transactions. For swaps, prefer `executeSwap`.\n *\n * @param swarmId - The swarm ID\n * @param template - Transaction template (ABI mode or raw calldata mode)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // ABI mode example - transfer tokens\n * const result = await client.executeTransaction('swarm-id', {\n * mode: 'abi',\n * contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * abi: [{\n * name: 'transfer',\n * type: 'function',\n * inputs: [\n * { name: 'to', type: 'address' },\n * { name: 'amount', type: 'uint256' },\n * ],\n * outputs: [{ type: 'bool' }],\n * }],\n * functionName: 'transfer',\n * args: ['0xRecipient', '{{percentage:tokenBalance:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913:50}}'],\n * value: '0',\n * });\n * ```\n */\n async executeTransaction(\n swarmId: string,\n template: TransactionTemplate\n ): Promise<{ transactionId: string; status: string }> {\n return this.request<{ transactionId: string; status: string }>(\n \"POST\",\n `/api/swarms/${swarmId}/transactions`,\n template\n );\n }\n\n /**\n * List transactions for a swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Array of transactions\n */\n async listTransactions(swarmId: string): Promise<Transaction[]> {\n return this.request<Transaction[]>(\"GET\", `/api/swarms/${swarmId}/transactions`);\n }\n\n /**\n * Get details of a specific transaction, including per-member status.\n *\n * @param transactionId - The transaction ID\n * @returns Transaction details with targets\n */\n async getTransaction(transactionId: string): Promise<Transaction> {\n return this.request<Transaction>(\"GET\", `/api/transactions/${transactionId}`);\n }\n\n /**\n * Wait for a transaction to complete.\n *\n * Polls the transaction status until it reaches COMPLETED or FAILED,\n * or until the timeout is reached.\n *\n * @param transactionId - The transaction ID\n * @param options - Wait options\n * @param options.timeoutMs - Maximum wait time (default 5 minutes)\n * @param options.pollIntervalMs - Polling interval (default 3 seconds)\n * @param options.onPoll - Callback called on each poll\n * @returns The completed transaction\n * @throws {SwarmVaultError} If timeout is reached or transaction fails\n *\n * @example\n * ```typescript\n * const tx = await client.waitForTransaction(transactionId, {\n * timeoutMs: 60000, // 1 minute\n * pollIntervalMs: 2000, // 2 seconds\n * onPoll: (t) => {\n * const confirmed = t.targets?.filter(t => t.status === 'CONFIRMED').length ?? 0;\n * const total = t.targets?.length ?? 0;\n * console.log(`Progress: ${confirmed}/${total}`);\n * },\n * });\n * ```\n */\n async waitForTransaction(\n transactionId: string,\n options: WaitForTransactionOptions = {}\n ): Promise<Transaction> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startTime = Date.now();\n\n while (true) {\n const transaction = await this.getTransaction(transactionId);\n\n if (options.onPoll) {\n options.onPoll(transaction);\n }\n\n if (transaction.status === \"COMPLETED\") {\n return transaction;\n }\n\n if (transaction.status === \"FAILED\") {\n throw new SwarmVaultError(`Transaction failed: ${transactionId}`, {\n errorCode: \"TX_FAILED\",\n details: transaction.targets?.filter((t) => t.error),\n });\n }\n\n if (Date.now() - startTime > timeoutMs) {\n throw new SwarmVaultError(\n `Transaction timeout: ${transactionId} did not complete within ${timeoutMs}ms`,\n {\n errorCode: \"TX_TIMEOUT\",\n details: { lastStatus: transaction.status },\n }\n );\n }\n\n await this.sleep(pollIntervalMs);\n }\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add authorization header\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n } else if (this.jwt) {\n headers[\"Authorization\"] = `Bearer ${this.jwt}`;\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || !data.success) {\n throw new SwarmVaultError(data.error || `Request failed with status ${response.status}`, {\n errorCode: data.errorCode,\n statusCode: response.status,\n details: data.details,\n });\n }\n\n return data.data as T;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Swarm Vault SDK Types\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface User {\n id: string;\n walletAddress: string;\n twitterId: string | null;\n twitterUsername: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Swarm {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n manager?: {\n id: string;\n walletAddress: string;\n twitterUsername: string | null;\n };\n memberCount?: number;\n isManager?: boolean;\n}\n\nexport interface SwarmMember {\n id: string;\n swarmId: string;\n userId: string;\n agentWalletAddress: string;\n status: \"ACTIVE\" | \"LEFT\";\n joinedAt: string;\n user?: {\n id: string;\n walletAddress: string;\n };\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport type TransactionStatus = \"PENDING\" | \"PROCESSING\" | \"COMPLETED\" | \"FAILED\";\nexport type TransactionTargetStatus = \"PENDING\" | \"SUBMITTED\" | \"CONFIRMED\" | \"FAILED\";\n\nexport interface Transaction {\n id: string;\n swarmId: string;\n status: TransactionStatus;\n template: TransactionTemplate;\n createdAt: string;\n updatedAt: string;\n targets?: TransactionTarget[];\n}\n\nexport interface TransactionTarget {\n id: string;\n transactionId: string;\n membershipId: string;\n userOpHash: string | null;\n txHash: string | null;\n status: TransactionTargetStatus;\n error: string | null;\n createdAt: string;\n updatedAt: string;\n membership?: {\n agentWalletAddress: string;\n user?: {\n walletAddress: string;\n };\n };\n}\n\nexport interface ABITransactionTemplate {\n mode: \"abi\";\n contractAddress: string;\n abi: unknown[];\n functionName: string;\n args: unknown[];\n value: string;\n}\n\nexport interface RawTransactionTemplate {\n mode: \"raw\";\n contractAddress: string;\n data: string;\n value: string;\n}\n\nexport type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;\n\nexport interface ExecuteTransactionParams {\n /** The transaction template */\n template: TransactionTemplate;\n /** Optional list of membership IDs to include (defaults to all active members) */\n membershipIds?: string[];\n}\n\n// ============================================================================\n// Swap Types\n// ============================================================================\n\nexport interface SwapPreviewParams {\n /** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */\n sellToken: string;\n /** Token address to buy */\n buyToken: string;\n /** Percentage of token balance to sell (1-100, default 100) */\n sellPercentage?: number;\n /** Slippage tolerance percentage (default 1) */\n slippagePercentage?: number;\n /** Optional list of membership IDs to include (defaults to all active members) */\n membershipIds?: string[];\n}\n\nexport interface SwapExecuteParams extends SwapPreviewParams {}\n\nexport interface SwapMemberPreview {\n membershipId: string;\n userId: string;\n userWalletAddress: string;\n agentWalletAddress: string;\n sellAmount: string;\n buyAmount: string;\n feeAmount?: string;\n estimatedPriceImpact?: number;\n sources?: string[];\n error?: string;\n}\n\nexport interface SwapFeeInfo {\n bps: number;\n percentage: string;\n recipientAddress: string;\n}\n\nexport interface SwapPreviewResult {\n sellToken: string;\n buyToken: string;\n sellPercentage: number;\n slippagePercentage: number;\n members: SwapMemberPreview[];\n totalSellAmount: string;\n totalBuyAmount: string;\n totalFeeAmount?: string;\n successCount: number;\n errorCount: number;\n fee: SwapFeeInfo | null;\n}\n\nexport interface SwapExecuteResult {\n transactionId: string;\n status: \"PENDING\";\n memberCount: number;\n message: string;\n fee: SwapFeeInfo | null;\n}\n\n// ============================================================================\n// Holdings Types\n// ============================================================================\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoUrl?: string;\n}\n\nexport interface TokenHolding extends TokenInfo {\n totalBalance: string;\n holderCount: number;\n}\n\nexport interface MemberTokenBalance {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n balance: string;\n}\n\nexport interface MemberBalance {\n membershipId: string;\n agentWalletAddress: string;\n userWalletAddress: string;\n ethBalance: string;\n tokens: MemberTokenBalance[];\n}\n\nexport interface SwarmHoldings {\n ethBalance: string;\n tokens: TokenHolding[];\n memberCount: number;\n commonTokens: TokenInfo[];\n /** Per-member balances (only included when includeMembers=true) */\n members?: MemberBalance[];\n}\n\nexport interface GetHoldingsOptions {\n /** Include per-member balances in the response */\n includeMembers?: boolean;\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n errorCode?: string;\n details?: unknown;\n}\n\n// ============================================================================\n// Client Options\n// ============================================================================\n\nexport interface SwarmVaultClientOptions {\n /** Base URL of the Swarm Vault API (default: https://api.swarmvault.xyz) */\n baseUrl?: string;\n /** API key for authentication (starts with 'svk_') */\n apiKey?: string;\n /** JWT token for authentication (alternative to API key) */\n jwt?: string;\n /** Custom fetch function (for testing or custom implementations) */\n fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n}\n\nexport interface WaitForTransactionOptions {\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\n timeoutMs?: number;\n /** Polling interval in milliseconds (default: 3000 = 3 seconds) */\n pollIntervalMs?: number;\n /** Callback called on each poll with current status */\n onPoll?: (transaction: Transaction) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class SwarmVaultError extends Error {\n public readonly errorCode?: string;\n public readonly statusCode?: number;\n public readonly details?: unknown;\n\n constructor(\n message: string,\n options?: {\n errorCode?: string;\n statusCode?: number;\n details?: unknown;\n }\n ) {\n super(message);\n this.name = \"SwarmVaultError\";\n this.errorCode = options?.errorCode;\n this.statusCode = options?.statusCode;\n this.details = options?.details;\n }\n}\n\n// ============================================================================\n// Common Token Addresses\n// ============================================================================\n\n/** Native ETH address used in swap APIs */\nexport const NATIVE_ETH_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n/** Common token addresses on Base Mainnet */\nexport const BASE_MAINNET_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n USDbC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n cbETH: \"0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22\",\n} as const;\n\n/** Common token addresses on Base Sepolia (testnet) */\nexport const BASE_SEPOLIA_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n} as const;\n","/**\n * Swarm Vault SDK Client\n *\n * A TypeScript client for the Swarm Vault API, enabling managers to execute\n * swaps and transactions on behalf of their swarm members.\n *\n * @example\n * ```typescript\n * import { SwarmVaultClient } from '@swarmvault/sdk';\n *\n * const client = new SwarmVaultClient({\n * apiKey: 'svk_your_api_key_here',\n * });\n *\n * // Get swarm holdings\n * const holdings = await client.getSwarmHoldings('swarm-id');\n *\n * // Execute a swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC\n * buyToken: '0x4200000000000000000000000000000000000006', // WETH\n * sellPercentage: 50,\n * });\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId);\n * ```\n */\n\nimport type {\n ApiResponse,\n Swarm,\n SwarmMember,\n SwarmHoldings,\n GetHoldingsOptions,\n SwapPreviewParams,\n SwapPreviewResult,\n SwapExecuteParams,\n SwapExecuteResult,\n Transaction,\n TransactionTemplate,\n ExecuteTransactionParams,\n User,\n SwarmVaultClientOptions,\n WaitForTransactionOptions,\n} from \"./types.js\";\nimport { SwarmVaultError } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.swarmvault.xyz\";\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\nconst DEFAULT_POLL_INTERVAL_MS = 3000; // 3 seconds\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport class SwarmVaultClient {\n private baseUrl: string;\n private apiKey?: string;\n private jwt?: string;\n private fetchFn: FetchFn;\n\n /**\n * Create a new Swarm Vault client.\n *\n * @param options - Client configuration options\n * @param options.baseUrl - Base URL of the API (default: https://api.swarmvault.xyz)\n * @param options.apiKey - API key for authentication (recommended)\n * @param options.jwt - JWT token for authentication (alternative to API key)\n */\n constructor(options: SwarmVaultClientOptions = {}) {\n this.baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.jwt = options.jwt;\n this.fetchFn = options.fetch || (globalThis.fetch as FetchFn);\n\n if (!this.fetchFn) {\n throw new SwarmVaultError(\n \"fetch is not available. Please provide a fetch implementation or use Node.js 18+.\"\n );\n }\n }\n\n // ===========================================================================\n // Authentication\n // ===========================================================================\n\n /**\n * Set the API key for authentication.\n * API keys start with 'svk_' and can be generated in the Swarm Vault settings.\n *\n * @param apiKey - The API key\n */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n this.jwt = undefined;\n }\n\n /**\n * Set the JWT token for authentication.\n * JWTs are obtained through the SIWE login flow.\n *\n * @param jwt - The JWT token\n */\n setJwt(jwt: string): void {\n this.jwt = jwt;\n this.apiKey = undefined;\n }\n\n /**\n * Get the currently authenticated user.\n *\n * @returns The authenticated user\n * @throws {SwarmVaultError} If not authenticated or request fails\n */\n async getMe(): Promise<User> {\n return this.request<User>(\"GET\", \"/api/auth/me\");\n }\n\n // ===========================================================================\n // Swarms\n // ===========================================================================\n\n /**\n * List all swarms. Returns public swarms for unauthenticated requests,\n * or includes management status for authenticated requests.\n *\n * @returns Array of swarms\n */\n async listSwarms(): Promise<Swarm[]> {\n return this.request<Swarm[]>(\"GET\", \"/api/swarms\");\n }\n\n /**\n * Get details of a specific swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Swarm details\n * @throws {SwarmVaultError} If swarm not found\n */\n async getSwarm(swarmId: string): Promise<Swarm> {\n return this.request<Swarm>(\"GET\", `/api/swarms/${swarmId}`);\n }\n\n /**\n * Get members of a swarm.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Array of swarm members\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmMembers(swarmId: string): Promise<SwarmMember[]> {\n return this.request<SwarmMember[]>(\"GET\", `/api/swarms/${swarmId}/members`);\n }\n\n /**\n * Get aggregate token holdings across all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @param options - Optional settings\n * @param options.includeMembers - Include per-member balances in the response\n * @returns Aggregated holdings with ETH balance, token balances, and common tokens\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmHoldings(swarmId: string, options?: GetHoldingsOptions): Promise<SwarmHoldings> {\n const queryParams = options?.includeMembers ? \"?includeMembers=true\" : \"\";\n return this.request<SwarmHoldings>(\"GET\", `/api/swarms/${swarmId}/holdings${queryParams}`);\n }\n\n // ===========================================================================\n // Swaps\n // ===========================================================================\n\n /**\n * Preview a swap for all swarm members without executing it.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * Use this to see expected amounts before executing a swap.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell (use NATIVE_ETH_ADDRESS for ETH)\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Preview with per-member amounts and totals\n *\n * @example\n * ```typescript\n * const preview = await client.previewSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * slippagePercentage: 1,\n * });\n *\n * console.log(`Total sell: ${preview.totalSellAmount}`);\n * console.log(`Expected buy: ${preview.totalBuyAmount}`);\n * console.log(`Success: ${preview.successCount}, Errors: ${preview.errorCount}`);\n * ```\n */\n async previewSwap(swarmId: string, params: SwapPreviewParams): Promise<SwapPreviewResult> {\n return this.request<SwapPreviewResult>(\"POST\", `/api/swarms/${swarmId}/swap/preview`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n ...(params.membershipIds && { membershipIds: params.membershipIds }),\n });\n }\n\n /**\n * Execute a swap for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * The swap is executed asynchronously. Use `waitForTransaction` to wait for completion.\n *\n * A platform fee (default 0.5%) is deducted from the buy token amount.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // Execute swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * });\n *\n * console.log(`Transaction started: ${result.transactionId}`);\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId, {\n * onPoll: (t) => console.log(`Status: ${t.status}`),\n * });\n *\n * console.log(`Transaction ${tx.status}`);\n * ```\n */\n async executeSwap(swarmId: string, params: SwapExecuteParams): Promise<SwapExecuteResult> {\n return this.request<SwapExecuteResult>(\"POST\", `/api/swarms/${swarmId}/swap/execute`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n ...(params.membershipIds && { membershipIds: params.membershipIds }),\n });\n }\n\n // ===========================================================================\n // Transactions\n // ===========================================================================\n\n /**\n * Execute a raw transaction template for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * This is an advanced method for custom transactions. For swaps, prefer `executeSwap`.\n *\n * @param swarmId - The swarm ID\n * @param template - Transaction template (ABI mode or raw calldata mode)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // ABI mode example - transfer tokens\n * const result = await client.executeTransaction('swarm-id', {\n * mode: 'abi',\n * contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * abi: [{\n * name: 'transfer',\n * type: 'function',\n * inputs: [\n * { name: 'to', type: 'address' },\n * { name: 'amount', type: 'uint256' },\n * ],\n * outputs: [{ type: 'bool' }],\n * }],\n * functionName: 'transfer',\n * args: ['0xRecipient', '{{percentage:tokenBalance:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913:50}}'],\n * value: '0',\n * });\n * ```\n */\n async executeTransaction(\n swarmId: string,\n templateOrParams: TransactionTemplate | ExecuteTransactionParams\n ): Promise<{ transactionId: string; status: string }> {\n // Support both direct template and params object with membershipIds\n const body = \"template\" in templateOrParams\n ? templateOrParams\n : { template: templateOrParams };\n\n return this.request<{ transactionId: string; status: string }>(\n \"POST\",\n `/api/swarms/${swarmId}/transactions`,\n body\n );\n }\n\n /**\n * List transactions for a swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Array of transactions\n */\n async listTransactions(swarmId: string): Promise<Transaction[]> {\n return this.request<Transaction[]>(\"GET\", `/api/swarms/${swarmId}/transactions`);\n }\n\n /**\n * Get details of a specific transaction, including per-member status.\n *\n * @param transactionId - The transaction ID\n * @returns Transaction details with targets\n */\n async getTransaction(transactionId: string): Promise<Transaction> {\n return this.request<Transaction>(\"GET\", `/api/transactions/${transactionId}`);\n }\n\n /**\n * Wait for a transaction to complete.\n *\n * Polls the transaction status until it reaches COMPLETED or FAILED,\n * or until the timeout is reached.\n *\n * @param transactionId - The transaction ID\n * @param options - Wait options\n * @param options.timeoutMs - Maximum wait time (default 5 minutes)\n * @param options.pollIntervalMs - Polling interval (default 3 seconds)\n * @param options.onPoll - Callback called on each poll\n * @returns The completed transaction\n * @throws {SwarmVaultError} If timeout is reached or transaction fails\n *\n * @example\n * ```typescript\n * const tx = await client.waitForTransaction(transactionId, {\n * timeoutMs: 60000, // 1 minute\n * pollIntervalMs: 2000, // 2 seconds\n * onPoll: (t) => {\n * const confirmed = t.targets?.filter(t => t.status === 'CONFIRMED').length ?? 0;\n * const total = t.targets?.length ?? 0;\n * console.log(`Progress: ${confirmed}/${total}`);\n * },\n * });\n * ```\n */\n async waitForTransaction(\n transactionId: string,\n options: WaitForTransactionOptions = {}\n ): Promise<Transaction> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startTime = Date.now();\n\n while (true) {\n const transaction = await this.getTransaction(transactionId);\n\n if (options.onPoll) {\n options.onPoll(transaction);\n }\n\n if (transaction.status === \"COMPLETED\") {\n return transaction;\n }\n\n if (transaction.status === \"FAILED\") {\n throw new SwarmVaultError(`Transaction failed: ${transactionId}`, {\n errorCode: \"TX_FAILED\",\n details: transaction.targets?.filter((t) => t.error),\n });\n }\n\n if (Date.now() - startTime > timeoutMs) {\n throw new SwarmVaultError(\n `Transaction timeout: ${transactionId} did not complete within ${timeoutMs}ms`,\n {\n errorCode: \"TX_TIMEOUT\",\n details: { lastStatus: transaction.status },\n }\n );\n }\n\n await this.sleep(pollIntervalMs);\n }\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add authorization header\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n } else if (this.jwt) {\n headers[\"Authorization\"] = `Bearer ${this.jwt}`;\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || !data.success) {\n throw new SwarmVaultError(data.error || `Request failed with status ${response.status}`, {\n errorCode: data.errorCode,\n statusCode: response.status,\n details: data.details,\n });\n }\n\n return data.data as T;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -78,6 +78,12 @@ interface RawTransactionTemplate {
|
|
|
78
78
|
value: string;
|
|
79
79
|
}
|
|
80
80
|
type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;
|
|
81
|
+
interface ExecuteTransactionParams {
|
|
82
|
+
/** The transaction template */
|
|
83
|
+
template: TransactionTemplate;
|
|
84
|
+
/** Optional list of membership IDs to include (defaults to all active members) */
|
|
85
|
+
membershipIds?: string[];
|
|
86
|
+
}
|
|
81
87
|
interface SwapPreviewParams {
|
|
82
88
|
/** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */
|
|
83
89
|
sellToken: string;
|
|
@@ -87,6 +93,8 @@ interface SwapPreviewParams {
|
|
|
87
93
|
sellPercentage?: number;
|
|
88
94
|
/** Slippage tolerance percentage (default 1) */
|
|
89
95
|
slippagePercentage?: number;
|
|
96
|
+
/** Optional list of membership IDs to include (defaults to all active members) */
|
|
97
|
+
membershipIds?: string[];
|
|
90
98
|
}
|
|
91
99
|
interface SwapExecuteParams extends SwapPreviewParams {
|
|
92
100
|
}
|
|
@@ -138,11 +146,31 @@ interface TokenHolding extends TokenInfo {
|
|
|
138
146
|
totalBalance: string;
|
|
139
147
|
holderCount: number;
|
|
140
148
|
}
|
|
149
|
+
interface MemberTokenBalance {
|
|
150
|
+
address: string;
|
|
151
|
+
symbol: string;
|
|
152
|
+
name: string;
|
|
153
|
+
decimals: number;
|
|
154
|
+
balance: string;
|
|
155
|
+
}
|
|
156
|
+
interface MemberBalance {
|
|
157
|
+
membershipId: string;
|
|
158
|
+
agentWalletAddress: string;
|
|
159
|
+
userWalletAddress: string;
|
|
160
|
+
ethBalance: string;
|
|
161
|
+
tokens: MemberTokenBalance[];
|
|
162
|
+
}
|
|
141
163
|
interface SwarmHoldings {
|
|
142
164
|
ethBalance: string;
|
|
143
165
|
tokens: TokenHolding[];
|
|
144
166
|
memberCount: number;
|
|
145
167
|
commonTokens: TokenInfo[];
|
|
168
|
+
/** Per-member balances (only included when includeMembers=true) */
|
|
169
|
+
members?: MemberBalance[];
|
|
170
|
+
}
|
|
171
|
+
interface GetHoldingsOptions {
|
|
172
|
+
/** Include per-member balances in the response */
|
|
173
|
+
includeMembers?: boolean;
|
|
146
174
|
}
|
|
147
175
|
interface ApiResponse<T> {
|
|
148
176
|
success: boolean;
|
|
@@ -290,10 +318,12 @@ declare class SwarmVaultClient {
|
|
|
290
318
|
* **Manager only** - requires authentication as a swarm manager.
|
|
291
319
|
*
|
|
292
320
|
* @param swarmId - The swarm ID
|
|
321
|
+
* @param options - Optional settings
|
|
322
|
+
* @param options.includeMembers - Include per-member balances in the response
|
|
293
323
|
* @returns Aggregated holdings with ETH balance, token balances, and common tokens
|
|
294
324
|
* @throws {SwarmVaultError} If not authorized or swarm not found
|
|
295
325
|
*/
|
|
296
|
-
getSwarmHoldings(swarmId: string): Promise<SwarmHoldings>;
|
|
326
|
+
getSwarmHoldings(swarmId: string, options?: GetHoldingsOptions): Promise<SwarmHoldings>;
|
|
297
327
|
/**
|
|
298
328
|
* Preview a swap for all swarm members without executing it.
|
|
299
329
|
* **Manager only** - requires authentication as a swarm manager.
|
|
@@ -390,7 +420,7 @@ declare class SwarmVaultClient {
|
|
|
390
420
|
* });
|
|
391
421
|
* ```
|
|
392
422
|
*/
|
|
393
|
-
executeTransaction(swarmId: string,
|
|
423
|
+
executeTransaction(swarmId: string, templateOrParams: TransactionTemplate | ExecuteTransactionParams): Promise<{
|
|
394
424
|
transactionId: string;
|
|
395
425
|
status: string;
|
|
396
426
|
}>;
|
|
@@ -440,4 +470,4 @@ declare class SwarmVaultClient {
|
|
|
440
470
|
private sleep;
|
|
441
471
|
}
|
|
442
472
|
|
|
443
|
-
export { type ABITransactionTemplate, type ApiResponse, BASE_MAINNET_TOKENS, BASE_SEPOLIA_TOKENS, NATIVE_ETH_ADDRESS, type RawTransactionTemplate, type SwapExecuteParams, type SwapExecuteResult, type SwapFeeInfo, type SwapMemberPreview, type SwapPreviewParams, type SwapPreviewResult, type Swarm, type SwarmHoldings, type SwarmMember, SwarmVaultClient, type SwarmVaultClientOptions, SwarmVaultError, type TokenHolding, type TokenInfo, type Transaction, type TransactionStatus, type TransactionTarget, type TransactionTargetStatus, type TransactionTemplate, type User, type WaitForTransactionOptions };
|
|
473
|
+
export { type ABITransactionTemplate, type ApiResponse, BASE_MAINNET_TOKENS, BASE_SEPOLIA_TOKENS, type ExecuteTransactionParams, type GetHoldingsOptions, type MemberBalance, type MemberTokenBalance, NATIVE_ETH_ADDRESS, type RawTransactionTemplate, type SwapExecuteParams, type SwapExecuteResult, type SwapFeeInfo, type SwapMemberPreview, type SwapPreviewParams, type SwapPreviewResult, type Swarm, type SwarmHoldings, type SwarmMember, SwarmVaultClient, type SwarmVaultClientOptions, SwarmVaultError, type TokenHolding, type TokenInfo, type Transaction, type TransactionStatus, type TransactionTarget, type TransactionTargetStatus, type TransactionTemplate, type User, type WaitForTransactionOptions };
|
package/dist/index.d.ts
CHANGED
|
@@ -78,6 +78,12 @@ interface RawTransactionTemplate {
|
|
|
78
78
|
value: string;
|
|
79
79
|
}
|
|
80
80
|
type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;
|
|
81
|
+
interface ExecuteTransactionParams {
|
|
82
|
+
/** The transaction template */
|
|
83
|
+
template: TransactionTemplate;
|
|
84
|
+
/** Optional list of membership IDs to include (defaults to all active members) */
|
|
85
|
+
membershipIds?: string[];
|
|
86
|
+
}
|
|
81
87
|
interface SwapPreviewParams {
|
|
82
88
|
/** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */
|
|
83
89
|
sellToken: string;
|
|
@@ -87,6 +93,8 @@ interface SwapPreviewParams {
|
|
|
87
93
|
sellPercentage?: number;
|
|
88
94
|
/** Slippage tolerance percentage (default 1) */
|
|
89
95
|
slippagePercentage?: number;
|
|
96
|
+
/** Optional list of membership IDs to include (defaults to all active members) */
|
|
97
|
+
membershipIds?: string[];
|
|
90
98
|
}
|
|
91
99
|
interface SwapExecuteParams extends SwapPreviewParams {
|
|
92
100
|
}
|
|
@@ -138,11 +146,31 @@ interface TokenHolding extends TokenInfo {
|
|
|
138
146
|
totalBalance: string;
|
|
139
147
|
holderCount: number;
|
|
140
148
|
}
|
|
149
|
+
interface MemberTokenBalance {
|
|
150
|
+
address: string;
|
|
151
|
+
symbol: string;
|
|
152
|
+
name: string;
|
|
153
|
+
decimals: number;
|
|
154
|
+
balance: string;
|
|
155
|
+
}
|
|
156
|
+
interface MemberBalance {
|
|
157
|
+
membershipId: string;
|
|
158
|
+
agentWalletAddress: string;
|
|
159
|
+
userWalletAddress: string;
|
|
160
|
+
ethBalance: string;
|
|
161
|
+
tokens: MemberTokenBalance[];
|
|
162
|
+
}
|
|
141
163
|
interface SwarmHoldings {
|
|
142
164
|
ethBalance: string;
|
|
143
165
|
tokens: TokenHolding[];
|
|
144
166
|
memberCount: number;
|
|
145
167
|
commonTokens: TokenInfo[];
|
|
168
|
+
/** Per-member balances (only included when includeMembers=true) */
|
|
169
|
+
members?: MemberBalance[];
|
|
170
|
+
}
|
|
171
|
+
interface GetHoldingsOptions {
|
|
172
|
+
/** Include per-member balances in the response */
|
|
173
|
+
includeMembers?: boolean;
|
|
146
174
|
}
|
|
147
175
|
interface ApiResponse<T> {
|
|
148
176
|
success: boolean;
|
|
@@ -290,10 +318,12 @@ declare class SwarmVaultClient {
|
|
|
290
318
|
* **Manager only** - requires authentication as a swarm manager.
|
|
291
319
|
*
|
|
292
320
|
* @param swarmId - The swarm ID
|
|
321
|
+
* @param options - Optional settings
|
|
322
|
+
* @param options.includeMembers - Include per-member balances in the response
|
|
293
323
|
* @returns Aggregated holdings with ETH balance, token balances, and common tokens
|
|
294
324
|
* @throws {SwarmVaultError} If not authorized or swarm not found
|
|
295
325
|
*/
|
|
296
|
-
getSwarmHoldings(swarmId: string): Promise<SwarmHoldings>;
|
|
326
|
+
getSwarmHoldings(swarmId: string, options?: GetHoldingsOptions): Promise<SwarmHoldings>;
|
|
297
327
|
/**
|
|
298
328
|
* Preview a swap for all swarm members without executing it.
|
|
299
329
|
* **Manager only** - requires authentication as a swarm manager.
|
|
@@ -390,7 +420,7 @@ declare class SwarmVaultClient {
|
|
|
390
420
|
* });
|
|
391
421
|
* ```
|
|
392
422
|
*/
|
|
393
|
-
executeTransaction(swarmId: string,
|
|
423
|
+
executeTransaction(swarmId: string, templateOrParams: TransactionTemplate | ExecuteTransactionParams): Promise<{
|
|
394
424
|
transactionId: string;
|
|
395
425
|
status: string;
|
|
396
426
|
}>;
|
|
@@ -440,4 +470,4 @@ declare class SwarmVaultClient {
|
|
|
440
470
|
private sleep;
|
|
441
471
|
}
|
|
442
472
|
|
|
443
|
-
export { type ABITransactionTemplate, type ApiResponse, BASE_MAINNET_TOKENS, BASE_SEPOLIA_TOKENS, NATIVE_ETH_ADDRESS, type RawTransactionTemplate, type SwapExecuteParams, type SwapExecuteResult, type SwapFeeInfo, type SwapMemberPreview, type SwapPreviewParams, type SwapPreviewResult, type Swarm, type SwarmHoldings, type SwarmMember, SwarmVaultClient, type SwarmVaultClientOptions, SwarmVaultError, type TokenHolding, type TokenInfo, type Transaction, type TransactionStatus, type TransactionTarget, type TransactionTargetStatus, type TransactionTemplate, type User, type WaitForTransactionOptions };
|
|
473
|
+
export { type ABITransactionTemplate, type ApiResponse, BASE_MAINNET_TOKENS, BASE_SEPOLIA_TOKENS, type ExecuteTransactionParams, type GetHoldingsOptions, type MemberBalance, type MemberTokenBalance, NATIVE_ETH_ADDRESS, type RawTransactionTemplate, type SwapExecuteParams, type SwapExecuteResult, type SwapFeeInfo, type SwapMemberPreview, type SwapPreviewParams, type SwapPreviewResult, type Swarm, type SwarmHoldings, type SwarmMember, SwarmVaultClient, type SwarmVaultClientOptions, SwarmVaultError, type TokenHolding, type TokenInfo, type Transaction, type TransactionStatus, type TransactionTarget, type TransactionTargetStatus, type TransactionTemplate, type User, type WaitForTransactionOptions };
|
package/dist/index.js
CHANGED
|
@@ -124,11 +124,14 @@ var SwarmVaultClient = class {
|
|
|
124
124
|
* **Manager only** - requires authentication as a swarm manager.
|
|
125
125
|
*
|
|
126
126
|
* @param swarmId - The swarm ID
|
|
127
|
+
* @param options - Optional settings
|
|
128
|
+
* @param options.includeMembers - Include per-member balances in the response
|
|
127
129
|
* @returns Aggregated holdings with ETH balance, token balances, and common tokens
|
|
128
130
|
* @throws {SwarmVaultError} If not authorized or swarm not found
|
|
129
131
|
*/
|
|
130
|
-
async getSwarmHoldings(swarmId) {
|
|
131
|
-
|
|
132
|
+
async getSwarmHoldings(swarmId, options) {
|
|
133
|
+
const queryParams = options?.includeMembers ? "?includeMembers=true" : "";
|
|
134
|
+
return this.request("GET", `/api/swarms/${swarmId}/holdings${queryParams}`);
|
|
132
135
|
}
|
|
133
136
|
// ===========================================================================
|
|
134
137
|
// Swaps
|
|
@@ -166,7 +169,8 @@ var SwarmVaultClient = class {
|
|
|
166
169
|
sellToken: params.sellToken,
|
|
167
170
|
buyToken: params.buyToken,
|
|
168
171
|
sellPercentage: params.sellPercentage ?? 100,
|
|
169
|
-
slippagePercentage: params.slippagePercentage ?? 1
|
|
172
|
+
slippagePercentage: params.slippagePercentage ?? 1,
|
|
173
|
+
...params.membershipIds && { membershipIds: params.membershipIds }
|
|
170
174
|
});
|
|
171
175
|
}
|
|
172
176
|
/**
|
|
@@ -209,7 +213,8 @@ var SwarmVaultClient = class {
|
|
|
209
213
|
sellToken: params.sellToken,
|
|
210
214
|
buyToken: params.buyToken,
|
|
211
215
|
sellPercentage: params.sellPercentage ?? 100,
|
|
212
|
-
slippagePercentage: params.slippagePercentage ?? 1
|
|
216
|
+
slippagePercentage: params.slippagePercentage ?? 1,
|
|
217
|
+
...params.membershipIds && { membershipIds: params.membershipIds }
|
|
213
218
|
});
|
|
214
219
|
}
|
|
215
220
|
// ===========================================================================
|
|
@@ -246,11 +251,12 @@ var SwarmVaultClient = class {
|
|
|
246
251
|
* });
|
|
247
252
|
* ```
|
|
248
253
|
*/
|
|
249
|
-
async executeTransaction(swarmId,
|
|
254
|
+
async executeTransaction(swarmId, templateOrParams) {
|
|
255
|
+
const body = "template" in templateOrParams ? templateOrParams : { template: templateOrParams };
|
|
250
256
|
return this.request(
|
|
251
257
|
"POST",
|
|
252
258
|
`/api/swarms/${swarmId}/transactions`,
|
|
253
|
-
|
|
259
|
+
body
|
|
254
260
|
);
|
|
255
261
|
}
|
|
256
262
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Swarm Vault SDK Types\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface User {\n id: string;\n walletAddress: string;\n twitterId: string | null;\n twitterUsername: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Swarm {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n manager?: {\n id: string;\n walletAddress: string;\n twitterUsername: string | null;\n };\n memberCount?: number;\n isManager?: boolean;\n}\n\nexport interface SwarmMember {\n id: string;\n swarmId: string;\n userId: string;\n agentWalletAddress: string;\n status: \"ACTIVE\" | \"LEFT\";\n joinedAt: string;\n user?: {\n id: string;\n walletAddress: string;\n };\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport type TransactionStatus = \"PENDING\" | \"PROCESSING\" | \"COMPLETED\" | \"FAILED\";\nexport type TransactionTargetStatus = \"PENDING\" | \"SUBMITTED\" | \"CONFIRMED\" | \"FAILED\";\n\nexport interface Transaction {\n id: string;\n swarmId: string;\n status: TransactionStatus;\n template: TransactionTemplate;\n createdAt: string;\n updatedAt: string;\n targets?: TransactionTarget[];\n}\n\nexport interface TransactionTarget {\n id: string;\n transactionId: string;\n membershipId: string;\n userOpHash: string | null;\n txHash: string | null;\n status: TransactionTargetStatus;\n error: string | null;\n createdAt: string;\n updatedAt: string;\n membership?: {\n agentWalletAddress: string;\n user?: {\n walletAddress: string;\n };\n };\n}\n\nexport interface ABITransactionTemplate {\n mode: \"abi\";\n contractAddress: string;\n abi: unknown[];\n functionName: string;\n args: unknown[];\n value: string;\n}\n\nexport interface RawTransactionTemplate {\n mode: \"raw\";\n contractAddress: string;\n data: string;\n value: string;\n}\n\nexport type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;\n\n// ============================================================================\n// Swap Types\n// ============================================================================\n\nexport interface SwapPreviewParams {\n /** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */\n sellToken: string;\n /** Token address to buy */\n buyToken: string;\n /** Percentage of token balance to sell (1-100, default 100) */\n sellPercentage?: number;\n /** Slippage tolerance percentage (default 1) */\n slippagePercentage?: number;\n}\n\nexport interface SwapExecuteParams extends SwapPreviewParams {}\n\nexport interface SwapMemberPreview {\n membershipId: string;\n userId: string;\n userWalletAddress: string;\n agentWalletAddress: string;\n sellAmount: string;\n buyAmount: string;\n feeAmount?: string;\n estimatedPriceImpact?: number;\n sources?: string[];\n error?: string;\n}\n\nexport interface SwapFeeInfo {\n bps: number;\n percentage: string;\n recipientAddress: string;\n}\n\nexport interface SwapPreviewResult {\n sellToken: string;\n buyToken: string;\n sellPercentage: number;\n slippagePercentage: number;\n members: SwapMemberPreview[];\n totalSellAmount: string;\n totalBuyAmount: string;\n totalFeeAmount?: string;\n successCount: number;\n errorCount: number;\n fee: SwapFeeInfo | null;\n}\n\nexport interface SwapExecuteResult {\n transactionId: string;\n status: \"PENDING\";\n memberCount: number;\n message: string;\n fee: SwapFeeInfo | null;\n}\n\n// ============================================================================\n// Holdings Types\n// ============================================================================\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoUrl?: string;\n}\n\nexport interface TokenHolding extends TokenInfo {\n totalBalance: string;\n holderCount: number;\n}\n\nexport interface SwarmHoldings {\n ethBalance: string;\n tokens: TokenHolding[];\n memberCount: number;\n commonTokens: TokenInfo[];\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n errorCode?: string;\n details?: unknown;\n}\n\n// ============================================================================\n// Client Options\n// ============================================================================\n\nexport interface SwarmVaultClientOptions {\n /** Base URL of the Swarm Vault API (default: https://api.swarmvault.xyz) */\n baseUrl?: string;\n /** API key for authentication (starts with 'svk_') */\n apiKey?: string;\n /** JWT token for authentication (alternative to API key) */\n jwt?: string;\n /** Custom fetch function (for testing or custom implementations) */\n fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n}\n\nexport interface WaitForTransactionOptions {\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\n timeoutMs?: number;\n /** Polling interval in milliseconds (default: 3000 = 3 seconds) */\n pollIntervalMs?: number;\n /** Callback called on each poll with current status */\n onPoll?: (transaction: Transaction) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class SwarmVaultError extends Error {\n public readonly errorCode?: string;\n public readonly statusCode?: number;\n public readonly details?: unknown;\n\n constructor(\n message: string,\n options?: {\n errorCode?: string;\n statusCode?: number;\n details?: unknown;\n }\n ) {\n super(message);\n this.name = \"SwarmVaultError\";\n this.errorCode = options?.errorCode;\n this.statusCode = options?.statusCode;\n this.details = options?.details;\n }\n}\n\n// ============================================================================\n// Common Token Addresses\n// ============================================================================\n\n/** Native ETH address used in swap APIs */\nexport const NATIVE_ETH_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n/** Common token addresses on Base Mainnet */\nexport const BASE_MAINNET_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n USDbC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n cbETH: \"0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22\",\n} as const;\n\n/** Common token addresses on Base Sepolia (testnet) */\nexport const BASE_SEPOLIA_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n} as const;\n","/**\n * Swarm Vault SDK Client\n *\n * A TypeScript client for the Swarm Vault API, enabling managers to execute\n * swaps and transactions on behalf of their swarm members.\n *\n * @example\n * ```typescript\n * import { SwarmVaultClient } from '@swarmvault/sdk';\n *\n * const client = new SwarmVaultClient({\n * apiKey: 'svk_your_api_key_here',\n * });\n *\n * // Get swarm holdings\n * const holdings = await client.getSwarmHoldings('swarm-id');\n *\n * // Execute a swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC\n * buyToken: '0x4200000000000000000000000000000000000006', // WETH\n * sellPercentage: 50,\n * });\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId);\n * ```\n */\n\nimport type {\n ApiResponse,\n Swarm,\n SwarmMember,\n SwarmHoldings,\n SwapPreviewParams,\n SwapPreviewResult,\n SwapExecuteParams,\n SwapExecuteResult,\n Transaction,\n TransactionTemplate,\n User,\n SwarmVaultClientOptions,\n WaitForTransactionOptions,\n} from \"./types.js\";\nimport { SwarmVaultError } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.swarmvault.xyz\";\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\nconst DEFAULT_POLL_INTERVAL_MS = 3000; // 3 seconds\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport class SwarmVaultClient {\n private baseUrl: string;\n private apiKey?: string;\n private jwt?: string;\n private fetchFn: FetchFn;\n\n /**\n * Create a new Swarm Vault client.\n *\n * @param options - Client configuration options\n * @param options.baseUrl - Base URL of the API (default: https://api.swarmvault.xyz)\n * @param options.apiKey - API key for authentication (recommended)\n * @param options.jwt - JWT token for authentication (alternative to API key)\n */\n constructor(options: SwarmVaultClientOptions = {}) {\n this.baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.jwt = options.jwt;\n this.fetchFn = options.fetch || (globalThis.fetch as FetchFn);\n\n if (!this.fetchFn) {\n throw new SwarmVaultError(\n \"fetch is not available. Please provide a fetch implementation or use Node.js 18+.\"\n );\n }\n }\n\n // ===========================================================================\n // Authentication\n // ===========================================================================\n\n /**\n * Set the API key for authentication.\n * API keys start with 'svk_' and can be generated in the Swarm Vault settings.\n *\n * @param apiKey - The API key\n */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n this.jwt = undefined;\n }\n\n /**\n * Set the JWT token for authentication.\n * JWTs are obtained through the SIWE login flow.\n *\n * @param jwt - The JWT token\n */\n setJwt(jwt: string): void {\n this.jwt = jwt;\n this.apiKey = undefined;\n }\n\n /**\n * Get the currently authenticated user.\n *\n * @returns The authenticated user\n * @throws {SwarmVaultError} If not authenticated or request fails\n */\n async getMe(): Promise<User> {\n return this.request<User>(\"GET\", \"/api/auth/me\");\n }\n\n // ===========================================================================\n // Swarms\n // ===========================================================================\n\n /**\n * List all swarms. Returns public swarms for unauthenticated requests,\n * or includes management status for authenticated requests.\n *\n * @returns Array of swarms\n */\n async listSwarms(): Promise<Swarm[]> {\n return this.request<Swarm[]>(\"GET\", \"/api/swarms\");\n }\n\n /**\n * Get details of a specific swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Swarm details\n * @throws {SwarmVaultError} If swarm not found\n */\n async getSwarm(swarmId: string): Promise<Swarm> {\n return this.request<Swarm>(\"GET\", `/api/swarms/${swarmId}`);\n }\n\n /**\n * Get members of a swarm.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Array of swarm members\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmMembers(swarmId: string): Promise<SwarmMember[]> {\n return this.request<SwarmMember[]>(\"GET\", `/api/swarms/${swarmId}/members`);\n }\n\n /**\n * Get aggregate token holdings across all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Aggregated holdings with ETH balance, token balances, and common tokens\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmHoldings(swarmId: string): Promise<SwarmHoldings> {\n return this.request<SwarmHoldings>(\"GET\", `/api/swarms/${swarmId}/holdings`);\n }\n\n // ===========================================================================\n // Swaps\n // ===========================================================================\n\n /**\n * Preview a swap for all swarm members without executing it.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * Use this to see expected amounts before executing a swap.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell (use NATIVE_ETH_ADDRESS for ETH)\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Preview with per-member amounts and totals\n *\n * @example\n * ```typescript\n * const preview = await client.previewSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * slippagePercentage: 1,\n * });\n *\n * console.log(`Total sell: ${preview.totalSellAmount}`);\n * console.log(`Expected buy: ${preview.totalBuyAmount}`);\n * console.log(`Success: ${preview.successCount}, Errors: ${preview.errorCount}`);\n * ```\n */\n async previewSwap(swarmId: string, params: SwapPreviewParams): Promise<SwapPreviewResult> {\n return this.request<SwapPreviewResult>(\"POST\", `/api/swarms/${swarmId}/swap/preview`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n });\n }\n\n /**\n * Execute a swap for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * The swap is executed asynchronously. Use `waitForTransaction` to wait for completion.\n *\n * A platform fee (default 0.5%) is deducted from the buy token amount.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // Execute swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * });\n *\n * console.log(`Transaction started: ${result.transactionId}`);\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId, {\n * onPoll: (t) => console.log(`Status: ${t.status}`),\n * });\n *\n * console.log(`Transaction ${tx.status}`);\n * ```\n */\n async executeSwap(swarmId: string, params: SwapExecuteParams): Promise<SwapExecuteResult> {\n return this.request<SwapExecuteResult>(\"POST\", `/api/swarms/${swarmId}/swap/execute`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n });\n }\n\n // ===========================================================================\n // Transactions\n // ===========================================================================\n\n /**\n * Execute a raw transaction template for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * This is an advanced method for custom transactions. For swaps, prefer `executeSwap`.\n *\n * @param swarmId - The swarm ID\n * @param template - Transaction template (ABI mode or raw calldata mode)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // ABI mode example - transfer tokens\n * const result = await client.executeTransaction('swarm-id', {\n * mode: 'abi',\n * contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * abi: [{\n * name: 'transfer',\n * type: 'function',\n * inputs: [\n * { name: 'to', type: 'address' },\n * { name: 'amount', type: 'uint256' },\n * ],\n * outputs: [{ type: 'bool' }],\n * }],\n * functionName: 'transfer',\n * args: ['0xRecipient', '{{percentage:tokenBalance:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913:50}}'],\n * value: '0',\n * });\n * ```\n */\n async executeTransaction(\n swarmId: string,\n template: TransactionTemplate\n ): Promise<{ transactionId: string; status: string }> {\n return this.request<{ transactionId: string; status: string }>(\n \"POST\",\n `/api/swarms/${swarmId}/transactions`,\n template\n );\n }\n\n /**\n * List transactions for a swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Array of transactions\n */\n async listTransactions(swarmId: string): Promise<Transaction[]> {\n return this.request<Transaction[]>(\"GET\", `/api/swarms/${swarmId}/transactions`);\n }\n\n /**\n * Get details of a specific transaction, including per-member status.\n *\n * @param transactionId - The transaction ID\n * @returns Transaction details with targets\n */\n async getTransaction(transactionId: string): Promise<Transaction> {\n return this.request<Transaction>(\"GET\", `/api/transactions/${transactionId}`);\n }\n\n /**\n * Wait for a transaction to complete.\n *\n * Polls the transaction status until it reaches COMPLETED or FAILED,\n * or until the timeout is reached.\n *\n * @param transactionId - The transaction ID\n * @param options - Wait options\n * @param options.timeoutMs - Maximum wait time (default 5 minutes)\n * @param options.pollIntervalMs - Polling interval (default 3 seconds)\n * @param options.onPoll - Callback called on each poll\n * @returns The completed transaction\n * @throws {SwarmVaultError} If timeout is reached or transaction fails\n *\n * @example\n * ```typescript\n * const tx = await client.waitForTransaction(transactionId, {\n * timeoutMs: 60000, // 1 minute\n * pollIntervalMs: 2000, // 2 seconds\n * onPoll: (t) => {\n * const confirmed = t.targets?.filter(t => t.status === 'CONFIRMED').length ?? 0;\n * const total = t.targets?.length ?? 0;\n * console.log(`Progress: ${confirmed}/${total}`);\n * },\n * });\n * ```\n */\n async waitForTransaction(\n transactionId: string,\n options: WaitForTransactionOptions = {}\n ): Promise<Transaction> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startTime = Date.now();\n\n while (true) {\n const transaction = await this.getTransaction(transactionId);\n\n if (options.onPoll) {\n options.onPoll(transaction);\n }\n\n if (transaction.status === \"COMPLETED\") {\n return transaction;\n }\n\n if (transaction.status === \"FAILED\") {\n throw new SwarmVaultError(`Transaction failed: ${transactionId}`, {\n errorCode: \"TX_FAILED\",\n details: transaction.targets?.filter((t) => t.error),\n });\n }\n\n if (Date.now() - startTime > timeoutMs) {\n throw new SwarmVaultError(\n `Transaction timeout: ${transactionId} did not complete within ${timeoutMs}ms`,\n {\n errorCode: \"TX_TIMEOUT\",\n details: { lastStatus: transaction.status },\n }\n );\n }\n\n await this.sleep(pollIntervalMs);\n }\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add authorization header\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n } else if (this.jwt) {\n headers[\"Authorization\"] = `Bearer ${this.jwt}`;\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || !data.success) {\n throw new SwarmVaultError(data.error || `Request failed with status ${response.status}`, {\n errorCode: data.errorCode,\n statusCode: response.status,\n details: data.details,\n });\n }\n\n return data.data as T;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Swarm Vault SDK Types\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface User {\n id: string;\n walletAddress: string;\n twitterId: string | null;\n twitterUsername: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Swarm {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n manager?: {\n id: string;\n walletAddress: string;\n twitterUsername: string | null;\n };\n memberCount?: number;\n isManager?: boolean;\n}\n\nexport interface SwarmMember {\n id: string;\n swarmId: string;\n userId: string;\n agentWalletAddress: string;\n status: \"ACTIVE\" | \"LEFT\";\n joinedAt: string;\n user?: {\n id: string;\n walletAddress: string;\n };\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport type TransactionStatus = \"PENDING\" | \"PROCESSING\" | \"COMPLETED\" | \"FAILED\";\nexport type TransactionTargetStatus = \"PENDING\" | \"SUBMITTED\" | \"CONFIRMED\" | \"FAILED\";\n\nexport interface Transaction {\n id: string;\n swarmId: string;\n status: TransactionStatus;\n template: TransactionTemplate;\n createdAt: string;\n updatedAt: string;\n targets?: TransactionTarget[];\n}\n\nexport interface TransactionTarget {\n id: string;\n transactionId: string;\n membershipId: string;\n userOpHash: string | null;\n txHash: string | null;\n status: TransactionTargetStatus;\n error: string | null;\n createdAt: string;\n updatedAt: string;\n membership?: {\n agentWalletAddress: string;\n user?: {\n walletAddress: string;\n };\n };\n}\n\nexport interface ABITransactionTemplate {\n mode: \"abi\";\n contractAddress: string;\n abi: unknown[];\n functionName: string;\n args: unknown[];\n value: string;\n}\n\nexport interface RawTransactionTemplate {\n mode: \"raw\";\n contractAddress: string;\n data: string;\n value: string;\n}\n\nexport type TransactionTemplate = ABITransactionTemplate | RawTransactionTemplate;\n\nexport interface ExecuteTransactionParams {\n /** The transaction template */\n template: TransactionTemplate;\n /** Optional list of membership IDs to include (defaults to all active members) */\n membershipIds?: string[];\n}\n\n// ============================================================================\n// Swap Types\n// ============================================================================\n\nexport interface SwapPreviewParams {\n /** Token address to sell (use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH) */\n sellToken: string;\n /** Token address to buy */\n buyToken: string;\n /** Percentage of token balance to sell (1-100, default 100) */\n sellPercentage?: number;\n /** Slippage tolerance percentage (default 1) */\n slippagePercentage?: number;\n /** Optional list of membership IDs to include (defaults to all active members) */\n membershipIds?: string[];\n}\n\nexport interface SwapExecuteParams extends SwapPreviewParams {}\n\nexport interface SwapMemberPreview {\n membershipId: string;\n userId: string;\n userWalletAddress: string;\n agentWalletAddress: string;\n sellAmount: string;\n buyAmount: string;\n feeAmount?: string;\n estimatedPriceImpact?: number;\n sources?: string[];\n error?: string;\n}\n\nexport interface SwapFeeInfo {\n bps: number;\n percentage: string;\n recipientAddress: string;\n}\n\nexport interface SwapPreviewResult {\n sellToken: string;\n buyToken: string;\n sellPercentage: number;\n slippagePercentage: number;\n members: SwapMemberPreview[];\n totalSellAmount: string;\n totalBuyAmount: string;\n totalFeeAmount?: string;\n successCount: number;\n errorCount: number;\n fee: SwapFeeInfo | null;\n}\n\nexport interface SwapExecuteResult {\n transactionId: string;\n status: \"PENDING\";\n memberCount: number;\n message: string;\n fee: SwapFeeInfo | null;\n}\n\n// ============================================================================\n// Holdings Types\n// ============================================================================\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoUrl?: string;\n}\n\nexport interface TokenHolding extends TokenInfo {\n totalBalance: string;\n holderCount: number;\n}\n\nexport interface MemberTokenBalance {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n balance: string;\n}\n\nexport interface MemberBalance {\n membershipId: string;\n agentWalletAddress: string;\n userWalletAddress: string;\n ethBalance: string;\n tokens: MemberTokenBalance[];\n}\n\nexport interface SwarmHoldings {\n ethBalance: string;\n tokens: TokenHolding[];\n memberCount: number;\n commonTokens: TokenInfo[];\n /** Per-member balances (only included when includeMembers=true) */\n members?: MemberBalance[];\n}\n\nexport interface GetHoldingsOptions {\n /** Include per-member balances in the response */\n includeMembers?: boolean;\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n errorCode?: string;\n details?: unknown;\n}\n\n// ============================================================================\n// Client Options\n// ============================================================================\n\nexport interface SwarmVaultClientOptions {\n /** Base URL of the Swarm Vault API (default: https://api.swarmvault.xyz) */\n baseUrl?: string;\n /** API key for authentication (starts with 'svk_') */\n apiKey?: string;\n /** JWT token for authentication (alternative to API key) */\n jwt?: string;\n /** Custom fetch function (for testing or custom implementations) */\n fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n}\n\nexport interface WaitForTransactionOptions {\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\n timeoutMs?: number;\n /** Polling interval in milliseconds (default: 3000 = 3 seconds) */\n pollIntervalMs?: number;\n /** Callback called on each poll with current status */\n onPoll?: (transaction: Transaction) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class SwarmVaultError extends Error {\n public readonly errorCode?: string;\n public readonly statusCode?: number;\n public readonly details?: unknown;\n\n constructor(\n message: string,\n options?: {\n errorCode?: string;\n statusCode?: number;\n details?: unknown;\n }\n ) {\n super(message);\n this.name = \"SwarmVaultError\";\n this.errorCode = options?.errorCode;\n this.statusCode = options?.statusCode;\n this.details = options?.details;\n }\n}\n\n// ============================================================================\n// Common Token Addresses\n// ============================================================================\n\n/** Native ETH address used in swap APIs */\nexport const NATIVE_ETH_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n/** Common token addresses on Base Mainnet */\nexport const BASE_MAINNET_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n USDbC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n cbETH: \"0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22\",\n} as const;\n\n/** Common token addresses on Base Sepolia (testnet) */\nexport const BASE_SEPOLIA_TOKENS = {\n ETH: NATIVE_ETH_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n} as const;\n","/**\n * Swarm Vault SDK Client\n *\n * A TypeScript client for the Swarm Vault API, enabling managers to execute\n * swaps and transactions on behalf of their swarm members.\n *\n * @example\n * ```typescript\n * import { SwarmVaultClient } from '@swarmvault/sdk';\n *\n * const client = new SwarmVaultClient({\n * apiKey: 'svk_your_api_key_here',\n * });\n *\n * // Get swarm holdings\n * const holdings = await client.getSwarmHoldings('swarm-id');\n *\n * // Execute a swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC\n * buyToken: '0x4200000000000000000000000000000000000006', // WETH\n * sellPercentage: 50,\n * });\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId);\n * ```\n */\n\nimport type {\n ApiResponse,\n Swarm,\n SwarmMember,\n SwarmHoldings,\n GetHoldingsOptions,\n SwapPreviewParams,\n SwapPreviewResult,\n SwapExecuteParams,\n SwapExecuteResult,\n Transaction,\n TransactionTemplate,\n ExecuteTransactionParams,\n User,\n SwarmVaultClientOptions,\n WaitForTransactionOptions,\n} from \"./types.js\";\nimport { SwarmVaultError } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.swarmvault.xyz\";\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\nconst DEFAULT_POLL_INTERVAL_MS = 3000; // 3 seconds\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport class SwarmVaultClient {\n private baseUrl: string;\n private apiKey?: string;\n private jwt?: string;\n private fetchFn: FetchFn;\n\n /**\n * Create a new Swarm Vault client.\n *\n * @param options - Client configuration options\n * @param options.baseUrl - Base URL of the API (default: https://api.swarmvault.xyz)\n * @param options.apiKey - API key for authentication (recommended)\n * @param options.jwt - JWT token for authentication (alternative to API key)\n */\n constructor(options: SwarmVaultClientOptions = {}) {\n this.baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.jwt = options.jwt;\n this.fetchFn = options.fetch || (globalThis.fetch as FetchFn);\n\n if (!this.fetchFn) {\n throw new SwarmVaultError(\n \"fetch is not available. Please provide a fetch implementation or use Node.js 18+.\"\n );\n }\n }\n\n // ===========================================================================\n // Authentication\n // ===========================================================================\n\n /**\n * Set the API key for authentication.\n * API keys start with 'svk_' and can be generated in the Swarm Vault settings.\n *\n * @param apiKey - The API key\n */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n this.jwt = undefined;\n }\n\n /**\n * Set the JWT token for authentication.\n * JWTs are obtained through the SIWE login flow.\n *\n * @param jwt - The JWT token\n */\n setJwt(jwt: string): void {\n this.jwt = jwt;\n this.apiKey = undefined;\n }\n\n /**\n * Get the currently authenticated user.\n *\n * @returns The authenticated user\n * @throws {SwarmVaultError} If not authenticated or request fails\n */\n async getMe(): Promise<User> {\n return this.request<User>(\"GET\", \"/api/auth/me\");\n }\n\n // ===========================================================================\n // Swarms\n // ===========================================================================\n\n /**\n * List all swarms. Returns public swarms for unauthenticated requests,\n * or includes management status for authenticated requests.\n *\n * @returns Array of swarms\n */\n async listSwarms(): Promise<Swarm[]> {\n return this.request<Swarm[]>(\"GET\", \"/api/swarms\");\n }\n\n /**\n * Get details of a specific swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Swarm details\n * @throws {SwarmVaultError} If swarm not found\n */\n async getSwarm(swarmId: string): Promise<Swarm> {\n return this.request<Swarm>(\"GET\", `/api/swarms/${swarmId}`);\n }\n\n /**\n * Get members of a swarm.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @returns Array of swarm members\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmMembers(swarmId: string): Promise<SwarmMember[]> {\n return this.request<SwarmMember[]>(\"GET\", `/api/swarms/${swarmId}/members`);\n }\n\n /**\n * Get aggregate token holdings across all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * @param swarmId - The swarm ID\n * @param options - Optional settings\n * @param options.includeMembers - Include per-member balances in the response\n * @returns Aggregated holdings with ETH balance, token balances, and common tokens\n * @throws {SwarmVaultError} If not authorized or swarm not found\n */\n async getSwarmHoldings(swarmId: string, options?: GetHoldingsOptions): Promise<SwarmHoldings> {\n const queryParams = options?.includeMembers ? \"?includeMembers=true\" : \"\";\n return this.request<SwarmHoldings>(\"GET\", `/api/swarms/${swarmId}/holdings${queryParams}`);\n }\n\n // ===========================================================================\n // Swaps\n // ===========================================================================\n\n /**\n * Preview a swap for all swarm members without executing it.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * Use this to see expected amounts before executing a swap.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell (use NATIVE_ETH_ADDRESS for ETH)\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Preview with per-member amounts and totals\n *\n * @example\n * ```typescript\n * const preview = await client.previewSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * slippagePercentage: 1,\n * });\n *\n * console.log(`Total sell: ${preview.totalSellAmount}`);\n * console.log(`Expected buy: ${preview.totalBuyAmount}`);\n * console.log(`Success: ${preview.successCount}, Errors: ${preview.errorCount}`);\n * ```\n */\n async previewSwap(swarmId: string, params: SwapPreviewParams): Promise<SwapPreviewResult> {\n return this.request<SwapPreviewResult>(\"POST\", `/api/swarms/${swarmId}/swap/preview`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n ...(params.membershipIds && { membershipIds: params.membershipIds }),\n });\n }\n\n /**\n * Execute a swap for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * The swap is executed asynchronously. Use `waitForTransaction` to wait for completion.\n *\n * A platform fee (default 0.5%) is deducted from the buy token amount.\n *\n * @param swarmId - The swarm ID\n * @param params - Swap parameters\n * @param params.sellToken - Token address to sell\n * @param params.buyToken - Token address to buy\n * @param params.sellPercentage - Percentage of balance to sell (1-100, default 100)\n * @param params.slippagePercentage - Slippage tolerance (default 1%)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // Execute swap\n * const result = await client.executeSwap('swarm-id', {\n * sellToken: BASE_MAINNET_TOKENS.USDC,\n * buyToken: BASE_MAINNET_TOKENS.WETH,\n * sellPercentage: 50,\n * });\n *\n * console.log(`Transaction started: ${result.transactionId}`);\n *\n * // Wait for completion\n * const tx = await client.waitForTransaction(result.transactionId, {\n * onPoll: (t) => console.log(`Status: ${t.status}`),\n * });\n *\n * console.log(`Transaction ${tx.status}`);\n * ```\n */\n async executeSwap(swarmId: string, params: SwapExecuteParams): Promise<SwapExecuteResult> {\n return this.request<SwapExecuteResult>(\"POST\", `/api/swarms/${swarmId}/swap/execute`, {\n sellToken: params.sellToken,\n buyToken: params.buyToken,\n sellPercentage: params.sellPercentage ?? 100,\n slippagePercentage: params.slippagePercentage ?? 1,\n ...(params.membershipIds && { membershipIds: params.membershipIds }),\n });\n }\n\n // ===========================================================================\n // Transactions\n // ===========================================================================\n\n /**\n * Execute a raw transaction template for all swarm members.\n * **Manager only** - requires authentication as a swarm manager.\n *\n * This is an advanced method for custom transactions. For swaps, prefer `executeSwap`.\n *\n * @param swarmId - The swarm ID\n * @param template - Transaction template (ABI mode or raw calldata mode)\n * @returns Transaction ID and status\n *\n * @example\n * ```typescript\n * // ABI mode example - transfer tokens\n * const result = await client.executeTransaction('swarm-id', {\n * mode: 'abi',\n * contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * abi: [{\n * name: 'transfer',\n * type: 'function',\n * inputs: [\n * { name: 'to', type: 'address' },\n * { name: 'amount', type: 'uint256' },\n * ],\n * outputs: [{ type: 'bool' }],\n * }],\n * functionName: 'transfer',\n * args: ['0xRecipient', '{{percentage:tokenBalance:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913:50}}'],\n * value: '0',\n * });\n * ```\n */\n async executeTransaction(\n swarmId: string,\n templateOrParams: TransactionTemplate | ExecuteTransactionParams\n ): Promise<{ transactionId: string; status: string }> {\n // Support both direct template and params object with membershipIds\n const body = \"template\" in templateOrParams\n ? templateOrParams\n : { template: templateOrParams };\n\n return this.request<{ transactionId: string; status: string }>(\n \"POST\",\n `/api/swarms/${swarmId}/transactions`,\n body\n );\n }\n\n /**\n * List transactions for a swarm.\n *\n * @param swarmId - The swarm ID\n * @returns Array of transactions\n */\n async listTransactions(swarmId: string): Promise<Transaction[]> {\n return this.request<Transaction[]>(\"GET\", `/api/swarms/${swarmId}/transactions`);\n }\n\n /**\n * Get details of a specific transaction, including per-member status.\n *\n * @param transactionId - The transaction ID\n * @returns Transaction details with targets\n */\n async getTransaction(transactionId: string): Promise<Transaction> {\n return this.request<Transaction>(\"GET\", `/api/transactions/${transactionId}`);\n }\n\n /**\n * Wait for a transaction to complete.\n *\n * Polls the transaction status until it reaches COMPLETED or FAILED,\n * or until the timeout is reached.\n *\n * @param transactionId - The transaction ID\n * @param options - Wait options\n * @param options.timeoutMs - Maximum wait time (default 5 minutes)\n * @param options.pollIntervalMs - Polling interval (default 3 seconds)\n * @param options.onPoll - Callback called on each poll\n * @returns The completed transaction\n * @throws {SwarmVaultError} If timeout is reached or transaction fails\n *\n * @example\n * ```typescript\n * const tx = await client.waitForTransaction(transactionId, {\n * timeoutMs: 60000, // 1 minute\n * pollIntervalMs: 2000, // 2 seconds\n * onPoll: (t) => {\n * const confirmed = t.targets?.filter(t => t.status === 'CONFIRMED').length ?? 0;\n * const total = t.targets?.length ?? 0;\n * console.log(`Progress: ${confirmed}/${total}`);\n * },\n * });\n * ```\n */\n async waitForTransaction(\n transactionId: string,\n options: WaitForTransactionOptions = {}\n ): Promise<Transaction> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startTime = Date.now();\n\n while (true) {\n const transaction = await this.getTransaction(transactionId);\n\n if (options.onPoll) {\n options.onPoll(transaction);\n }\n\n if (transaction.status === \"COMPLETED\") {\n return transaction;\n }\n\n if (transaction.status === \"FAILED\") {\n throw new SwarmVaultError(`Transaction failed: ${transactionId}`, {\n errorCode: \"TX_FAILED\",\n details: transaction.targets?.filter((t) => t.error),\n });\n }\n\n if (Date.now() - startTime > timeoutMs) {\n throw new SwarmVaultError(\n `Transaction timeout: ${transactionId} did not complete within ${timeoutMs}ms`,\n {\n errorCode: \"TX_TIMEOUT\",\n details: { lastStatus: transaction.status },\n }\n );\n }\n\n await this.sleep(pollIntervalMs);\n }\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add authorization header\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n } else if (this.jwt) {\n headers[\"Authorization\"] = `Bearer ${this.jwt}`;\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || !data.success) {\n throw new SwarmVaultError(data.error || `Request failed with status ${response.status}`, {\n errorCode: data.errorCode,\n statusCode: response.status,\n details: data.details,\n });\n }\n\n return data.data as T;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"]}
|
package/package.json
CHANGED