@compass-labs/widgets 0.1.46 → 0.1.48
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/{compass-service-D0Xf69NR.d.ts → compass-service-BzYob9QR.d.ts} +1 -2
- package/dist/{compass-service-B0UscWqQ.d.mts → compass-service-Dz4PTtzj.d.mts} +1 -2
- package/dist/index.d.mts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -1
- package/dist/index.mjs.map +1 -1
- package/dist/server/core/index.d.mts +1 -1
- package/dist/server/core/index.d.ts +1 -1
- package/dist/server/core/index.js +7 -8
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/core/index.mjs +7 -8
- package/dist/server/core/index.mjs.map +1 -1
- package/dist/server/index.js +7 -8
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +7 -8
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/nestjs/index.d.mts +1 -1
- package/dist/server/nestjs/index.d.ts +1 -1
- package/dist/server/nestjs/index.js +7 -8
- package/dist/server/nestjs/index.js.map +1 -1
- package/dist/server/nestjs/index.mjs +7 -8
- package/dist/server/nestjs/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -199,7 +199,7 @@ var CompassCoreService = class {
|
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
201
|
async managePrepare(body, action) {
|
|
202
|
-
const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent
|
|
202
|
+
const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent } = body;
|
|
203
203
|
let venue;
|
|
204
204
|
if (venueType === "VAULT" && vaultAddress) {
|
|
205
205
|
venue = {
|
|
@@ -227,8 +227,7 @@ var CompassCoreService = class {
|
|
|
227
227
|
venue,
|
|
228
228
|
action,
|
|
229
229
|
amount,
|
|
230
|
-
gasSponsorship: true
|
|
231
|
-
...recipient && { recipient }
|
|
230
|
+
gasSponsorship: true
|
|
232
231
|
});
|
|
233
232
|
const eip712 = response.eip712;
|
|
234
233
|
if (!eip712) {
|
|
@@ -343,7 +342,7 @@ var CompassCoreService = class {
|
|
|
343
342
|
}
|
|
344
343
|
}
|
|
345
344
|
async transferPrepare(body) {
|
|
346
|
-
const { owner, chain = "base", token, amount, action, product } = body;
|
|
345
|
+
const { owner, chain = "base", token, amount, action, product, recipient } = body;
|
|
347
346
|
const { gasSponsorPrivateKey } = this.config;
|
|
348
347
|
if (!owner || !token || !amount || !action) {
|
|
349
348
|
throw new CompassServiceError("Missing required parameters", 400);
|
|
@@ -372,7 +371,8 @@ var CompassCoreService = class {
|
|
|
372
371
|
amount,
|
|
373
372
|
action,
|
|
374
373
|
gasSponsorship: true,
|
|
375
|
-
...spender && { spender }
|
|
374
|
+
...spender && { spender },
|
|
375
|
+
...recipient && action === "WITHDRAW" && { recipient }
|
|
376
376
|
});
|
|
377
377
|
}
|
|
378
378
|
const eip712 = response.eip712;
|
|
@@ -674,7 +674,7 @@ var CompassCoreService = class {
|
|
|
674
674
|
}
|
|
675
675
|
// --- Bundle ---
|
|
676
676
|
async bundlePrepare(body) {
|
|
677
|
-
const { owner, chain = "base", actions
|
|
677
|
+
const { owner, chain = "base", actions } = body;
|
|
678
678
|
if (!owner || !actions || actions.length === 0) {
|
|
679
679
|
throw new CompassServiceError("Missing owner or actions", 400);
|
|
680
680
|
}
|
|
@@ -682,8 +682,7 @@ var CompassCoreService = class {
|
|
|
682
682
|
owner,
|
|
683
683
|
chain,
|
|
684
684
|
gasSponsorship: true,
|
|
685
|
-
actions
|
|
686
|
-
...recipient && { recipient }
|
|
685
|
+
actions
|
|
687
686
|
});
|
|
688
687
|
const eip712 = response.eip712;
|
|
689
688
|
if (!eip712) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/core/types.ts","../../../src/server/core/utils.ts","../../../src/server/core/compass-service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Chain } from 'viem';\nimport { mainnet, base, arbitrum } from 'viem/chains';\n\nexport const CHAIN_MAP: Record<string, Chain> = {\n ethereum: mainnet,\n base: base,\n arbitrum: arbitrum,\n};\n\nexport interface CompassHandlerConfig {\n /** Compass API key - keep this in environment variables */\n apiKey: string;\n /** Optional custom API server URL */\n serverUrl?: string;\n /** Gas sponsor private key (required for executing gas-sponsored transactions) */\n gasSponsorPrivateKey?: string;\n /** RPC URLs per chain (required for executing gas-sponsored transactions) */\n rpcUrls?: {\n ethereum?: string;\n base?: string;\n arbitrum?: string;\n };\n}\n\nexport const CREDIT_TOKENS: Record<string, string[]> = {\n base: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n ethereum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n arbitrum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n};\n","/**\n * Extracts a user-friendly error message from SDK/API errors.\n * SDK errors contain verbose technical data (Zod dumps, full HTTP bodies) that\n * should never be shown to end-users.\n */\nexport function extractErrorMessage(error: unknown): { message: string; status: number } {\n if (!(error instanceof Error)) {\n return { message: 'Something went wrong. Please try again.', status: 500 };\n }\n\n const raw = error.message || '';\n\n // SDK's CompassAPISDKError and subclasses embed a JSON body in the message.\n // Try to extract the API's own \"detail\" / \"error\" / \"description\" from it.\n const jsonMatch = raw.match(/Body:\\s*(\\{[\\s\\S]*\\})/);\n if (jsonMatch) {\n try {\n const body = JSON.parse(jsonMatch[1]);\n // FastAPI validation error -> detail is an array of {msg, loc, type}\n if (Array.isArray(body.detail)) {\n const msgs = body.detail.map((d: any) => d.msg || d.message).filter(Boolean);\n if (msgs.length > 0) return { message: msgs.join('. '), status: 422 };\n }\n // Single-string detail (e.g. \"Insufficient USDC balance\")\n if (typeof body.detail === 'string') return { message: body.detail, status: 422 };\n if (typeof body.error === 'string') return { message: body.error, status: 500 };\n if (typeof body.description === 'string') return { message: body.description, status: 500 };\n } catch {\n // JSON parse failed — fall through\n }\n }\n\n // SDKValidationError (Zod) — replace with generic message\n if (error.name === 'SDKValidationError' || raw.startsWith('Input validation failed')) {\n return { message: 'Invalid request data. Please check your inputs and try again.', status: 400 };\n }\n\n // Known user-facing patterns — return the line containing the pattern\n const knownPatterns = ['Insufficient', 'not deployed', 'reverted', 'not configured', 'Unsupported chain'];\n const lines = raw.split('\\n');\n for (const pattern of knownPatterns) {\n const matchingLine = lines.find(line => line.includes(pattern));\n if (matchingLine) {\n return { message: matchingLine.trim(), status: 500 };\n }\n }\n\n // Fallback — avoid leaking raw SDK internals\n return { message: 'Something went wrong. Please try again.', status: 500 };\n}\n\nexport function jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n","import { CompassApiSDK } from '@compass-labs/api-sdk';\nimport {\n createWalletClient,\n createPublicClient,\n http,\n type Hex,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { CompassHandlerConfig, CHAIN_MAP, CREDIT_TOKENS } from './types';\n\nexport class CompassServiceError extends Error {\n constructor(message: string, public statusCode: number) {\n super(message);\n this.name = 'CompassServiceError';\n }\n}\n\nexport class CompassCoreService {\n protected client: CompassApiSDK;\n protected config: CompassHandlerConfig;\n\n constructor(config: CompassHandlerConfig) {\n this.config = config;\n const { apiKey, serverUrl = 'https://api.compasslabs.ai' } = config;\n this.client = new CompassApiSDK({\n apiKeyAuth: apiKey,\n serverURL: serverUrl,\n });\n }\n\n // --- Earn ---\n\n async earnAccountCheck(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return {\n earnAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n };\n }\n\n async earnAccountBalances(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const data = response as any;\n\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n const balances: Record<string, { balance: string; usdValue: string }> = {};\n\n for (const [symbol, tokenData] of Object.entries(data.balances)) {\n const td = tokenData as any;\n const hasRealTransfers = td.transfers.some((t: any) => {\n const fromAddr = (t.from_address || t.fromAddress || '').toLowerCase();\n const toAddr = (t.to_address || t.toAddress || '').toLowerCase();\n return fromAddr !== ZERO_ADDRESS && toAddr !== ZERO_ADDRESS;\n });\n\n const balanceFormatted = td.balance_formatted || td.balanceFormatted || '0';\n const balanceNum = parseFloat(balanceFormatted);\n if (balanceNum === 0 && !hasRealTransfers) {\n continue;\n }\n\n if (!hasRealTransfers && td.transfers.length > 0) {\n continue;\n }\n\n const usdValue = td.usd_value || td.usdValue || '0';\n const usdValueNum = parseFloat(usdValue);\n if (usdValueNum === 0 || isNaN(usdValueNum)) {\n continue;\n }\n\n balances[symbol] = {\n balance: balanceFormatted,\n usdValue,\n };\n }\n\n const earnAccountAddr = data.earn_account_address || data.earnAccountAddress || '';\n const totalUsd = data.total_usd_value || data.totalUsdValue || '0';\n\n return {\n earnAccountAddress: earnAccountAddr,\n balances,\n totalUsdValue: totalUsd,\n };\n }\n\n async createAccount(body: { owner: string; chain?: string }) {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n\n if (!response.transaction) {\n return {\n earnAccountAddress,\n success: true,\n alreadyExists: true,\n };\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Account creation transaction reverted', 500);\n }\n\n return {\n earnAccountAddress,\n txHash,\n success: true,\n };\n }\n\n async managePrepare(body: {\n amount: string;\n token: string;\n owner: string;\n chain: string;\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n vaultAddress?: string;\n marketAddress?: string;\n maxSlippagePercent?: number;\n recipient?: string;\n }, action: 'DEPOSIT' | 'WITHDRAW') {\n const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent, recipient } = body;\n\n let venue: any;\n\n if (venueType === 'VAULT' && vaultAddress) {\n venue = {\n type: 'VAULT' as const,\n vaultAddress,\n };\n } else if (venueType === 'AAVE') {\n venue = {\n type: 'AAVE' as const,\n token,\n };\n } else if (venueType === 'PENDLE_PT' && marketAddress) {\n venue = {\n type: 'PENDLE_PT' as const,\n marketAddress,\n token: action === 'DEPOSIT' ? token : undefined,\n maxSlippagePercent: maxSlippagePercent ?? 1.0,\n };\n } else {\n throw new CompassServiceError('Invalid venue type or missing address', 400);\n }\n\n const response = await this.client.earn.earnManage({\n owner,\n chain: chain as any,\n venue,\n action,\n amount,\n gasSponsorship: true,\n ...(recipient && { recipient }),\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n };\n }\n\n async execute(body: {\n owner: string;\n eip712: any;\n signature: string;\n chain: string;\n }) {\n const { owner, eip712, signature, chain } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n return { txHash, success: true };\n }\n\n // --- Transfer ---\n\n async transferApprove(body: { owner: string; chain?: string; token: string }) {\n const { owner, chain = 'base', token } = body;\n\n if (!owner || !token) {\n throw new CompassServiceError('Missing owner or token parameter', 400);\n }\n\n try {\n const response = await this.client.gasSponsorship.gasSponsorshipApproveTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712 || (response as any).eip_712;\n const transaction = (response as any).transaction;\n\n if (!eip712 && !transaction) {\n return {\n approved: true,\n message: 'Token already approved for Permit2',\n };\n }\n\n if (eip712) {\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n Permit: types.permit || types.Permit,\n };\n\n return {\n approved: false,\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n };\n }\n\n return {\n approved: false,\n transaction,\n requiresTransaction: true,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('already set') || errorMessage.includes('already been set')) {\n return {\n approved: true,\n message: 'Token allowance already set',\n };\n }\n throw error;\n }\n }\n\n async transferPrepare(body: {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\n product?: 'earn' | 'credit';\n }) {\n const { owner, chain = 'base', token, amount, action, product } = body;\n const { gasSponsorPrivateKey } = this.config;\n\n if (!owner || !token || !amount || !action) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n let spender: string | undefined;\n if (action === 'DEPOSIT' && gasSponsorPrivateKey) {\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n spender = sponsorAccount.address;\n }\n\n let response: any;\n if (product === 'credit') {\n response = await this.client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n } else {\n response = await this.client.earn.earnTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n }\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n let normalizedTypes: Record<string, any>;\n\n if (action === 'DEPOSIT') {\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n PermitTransferFrom: types.permitTransferFrom || types.PermitTransferFrom,\n TokenPermissions: types.tokenPermissions || types.TokenPermissions,\n };\n } else {\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n }\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n };\n }\n\n async transferExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n }) {\n const { owner, chain = 'base', eip712, signature, product } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n ...(product === 'credit' && { product: 'credit' }),\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n return { txHash, success: true };\n }\n\n async approvalExecute(body: {\n owner: string;\n chain?: string;\n transaction: any;\n }) {\n const { owner, chain = 'base', transaction } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !transaction) {\n throw new CompassServiceError('Missing required parameters (owner, transaction)', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: 60_000,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Approval transaction reverted', 500);\n }\n\n return { txHash, status: 'success' };\n }\n\n // --- Swap ---\n\n async swapQuote(params: {\n owner?: string;\n chain?: string;\n tokenIn?: string;\n tokenOut?: string;\n amountIn?: string;\n }) {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn } = params;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n throw new CompassServiceError('Missing required parameters: owner, tokenIn, tokenOut, amountIn', 400);\n }\n\n try {\n const response = await this.client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage: 1.0,\n gasSponsorship: true,\n });\n\n const estimatedAmountOut = (response as any).estimatedAmountOut || '0';\n\n return {\n tokenIn,\n tokenOut,\n amountIn,\n estimatedAmountOut: estimatedAmountOut?.toString() || '0',\n };\n } catch (error: any) {\n let errorMessage = 'Failed to get swap quote';\n\n try {\n const bodyMessage = error?.body?.message || error?.message || '';\n\n if (bodyMessage.includes('{')) {\n const jsonMatch = bodyMessage.match(/\\{.*\\}/s);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;\n }\n } else if (bodyMessage) {\n const balanceMatch = bodyMessage.match(/Insufficient \\w+ balance[^.]+/i);\n if (balanceMatch) {\n errorMessage = balanceMatch[0];\n } else {\n errorMessage = bodyMessage;\n }\n }\n } catch {\n errorMessage = error?.body?.error || error?.message || 'Failed to get swap quote';\n }\n\n throw new CompassServiceError(errorMessage, 400);\n }\n }\n\n async swapPrepare(body: {\n owner: string;\n chain?: string;\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n slippage?: number;\n }) {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn, slippage = 1.0 } = body;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n throw new CompassServiceError('Missing required parameters: owner, tokenIn, tokenOut, amountIn', 400);\n }\n\n const response = await this.client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n estimatedAmountOut: (response as any).estimatedAmountOut?.toString() || '0',\n };\n }\n\n async swapExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n }) {\n const { owner, chain = 'base', eip712, signature } = body;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters: owner, eip712, signature', 400);\n }\n\n if (!this.config.gasSponsorPrivateKey) {\n throw new CompassServiceError('Gas sponsor not configured', 500);\n }\n\n const chainLower = chain.toLowerCase();\n const rpcUrl = this.config.rpcUrls?.[chainLower as keyof typeof this.config.rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const viemChain = CHAIN_MAP[chainLower];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 400);\n }\n\n const sponsorAccount = privateKeyToAccount(this.config.gasSponsorPrivateKey as `0x${string}`);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError('No transaction returned from gas sponsorship prepare', 500);\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Transaction reverted', 500);\n }\n\n return { txHash, success: true };\n }\n\n // --- Token ---\n\n async tokenBalance(params: { chain?: string; token?: string; address?: string }) {\n const { chain = 'base', token, address } = params;\n\n if (!token || !address) {\n throw new CompassServiceError('Missing token or address parameter', 400);\n }\n\n try {\n const response = await this.client.token.tokenBalance({\n chain: chain as any,\n token,\n user: address,\n });\n\n return {\n token,\n address,\n balance: (response as any).amount || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n };\n } catch {\n return {\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n };\n }\n }\n\n async tokenPrices(params: Record<string, string>) {\n const { chain = 'base', tokens } = params;\n\n if (!tokens) {\n throw new CompassServiceError('Missing tokens parameter', 400);\n }\n\n const tokenList = tokens.split(',').map((t) => t.trim().toUpperCase());\n const prices: Record<string, number> = {};\n\n const results = await Promise.allSettled(\n tokenList.map(async (symbol) => {\n const resp = await this.client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n prices[result.value.symbol] = result.value.price;\n }\n }\n\n return { prices };\n }\n\n // --- Bundle ---\n\n async bundlePrepare(body: {\n owner: string;\n chain?: string;\n actions: Array<{ actionType: string; [key: string]: any }>;\n recipient?: string;\n }) {\n const { owner, chain = 'base', actions, recipient } = body;\n\n if (!owner || !actions || actions.length === 0) {\n throw new CompassServiceError('Missing owner or actions', 400);\n }\n\n const response = await this.client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: actions as any,\n ...(recipient && { recipient }),\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n };\n }\n\n async bundleExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n }) {\n return this.transferExecute(body);\n }\n\n // --- Data ---\n\n async vaults(params: {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n assetSymbol?: string;\n minTvlUsd?: string;\n }) {\n const { chain = 'base', orderBy = 'apy_7d', direction = 'desc', limit = '100', assetSymbol, minTvlUsd } = params;\n\n try {\n const response = await this.client.earn.earnVaults({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(assetSymbol && { assetSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch vaults', 500);\n }\n }\n\n async aaveMarkets(params: { chain?: string }) {\n const { chain = 'base' } = params;\n\n try {\n const response = await this.client.earn.earnAaveMarkets({\n chain: chain as any,\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch Aave markets', 500);\n }\n }\n\n async pendleMarkets(params: {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n underlyingSymbol?: string;\n minTvlUsd?: string;\n }) {\n const { chain = 'base', orderBy = 'implied_apy', direction = 'desc', limit = '100', underlyingSymbol, minTvlUsd } = params;\n\n try {\n const response = await this.client.earn.earnPendleMarkets({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(underlyingSymbol && { underlyingSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch Pendle markets', 500);\n }\n }\n\n async positions(params: { chain?: string; owner?: string }) {\n const { chain = 'base', owner } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n try {\n const positionsResponse = await this.client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const raw = JSON.parse(JSON.stringify(positionsResponse));\n\n const positions: any[] = [];\n\n // Aave positions\n const aavePositions = raw.aave || [];\n for (const a of aavePositions) {\n const balance = a.balance || '0';\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n const pnl = a.pnl;\n\n positions.push({\n protocol: 'aave',\n symbol,\n name: `${symbol} on Aave`,\n balance,\n balanceUsd: a.usdValue || a.usd_value || balance,\n apy: parseFloat(a.apy || '0'),\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (a.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (a.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Morpho vault positions\n const vaultPositions = raw.vaults || [];\n for (const v of vaultPositions) {\n const balance = v.balance || '0';\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n const vaultName = v.vaultName || v.vault_name || `${symbol} Vault`;\n const pnl = v.pnl;\n\n positions.push({\n protocol: 'vaults',\n symbol,\n name: vaultName,\n balance,\n balanceUsd: v.usdValue || v.usd_value || balance,\n apy: parseFloat(v.apy7d || v.apy_7d || '0'),\n vaultAddress: v.vaultAddress || v.vault_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (v.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (v.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Pendle positions\n const pendlePositions = raw.pendlePt || raw.pendle_pt || [];\n for (const p of pendlePositions) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n const pnl = p.pnl;\n\n positions.push({\n protocol: 'pendle',\n symbol,\n name: `PT-${symbol}`,\n balance,\n balanceUsd: p.usdValue || p.usd_value || balance,\n apy: parseFloat(p.impliedApy || p.implied_apy || '0'),\n marketAddress: p.marketAddress || p.market_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (p.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (p.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n return { positions };\n } catch {\n throw new CompassServiceError('Failed to fetch positions', 500);\n }\n }\n\n async txReceipt(params: Record<string, string>) {\n const { hash, chain } = params;\n\n if (!hash || !chain) {\n throw new CompassServiceError('Missing hash or chain parameter', 400);\n }\n\n const rpcUrl = this.config.rpcUrls?.[chain.toLowerCase() as keyof typeof this.config.rpcUrls];\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 400);\n }\n\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n try {\n const receipt = await publicClient.getTransactionReceipt({\n hash: hash as `0x${string}`,\n });\n return {\n status: receipt.status,\n blockNumber: receipt.blockNumber.toString(),\n };\n } catch {\n return { status: 'pending' };\n }\n }\n\n // --- Rebalance ---\n\n async rebalancePreview(body: {\n owner: string;\n chain?: string;\n targets: Array<{\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n venueAddress: string;\n targetPercent: number;\n token?: string;\n originalPercent?: number;\n }>;\n slippage?: number;\n }) {\n const { owner, chain = 'base', targets, slippage = 0.5 } = body;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!targets || targets.length === 0) {\n throw new CompassServiceError('Missing targets', 400);\n }\n\n for (const t of targets) {\n if (t.targetPercent < 0 || t.targetPercent > 100) {\n throw new CompassServiceError(`Invalid target percentage: ${t.targetPercent}%`, 400);\n }\n }\n\n try {\n // Step 1: Fetch current positions\n const positionsResponse = await this.client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const positionsRaw = JSON.parse(JSON.stringify(positionsResponse));\n\n // Step 2: Fetch current balances\n const balancesResponse = await this.client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const balancesRaw = JSON.parse(JSON.stringify(balancesResponse));\n\n // Step 3: Compute current portfolio USD values\n interface CurrentPosition {\n venueType: string;\n venueAddress: string;\n token: string;\n usdValue: number;\n balance: string;\n }\n\n const currentPositions: CurrentPosition[] = [];\n\n // Aave positions\n for (const a of positionsRaw.aave || []) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n currentPositions.push({\n venueType: 'AAVE',\n venueAddress: symbol,\n token: symbol,\n usdValue: parseFloat(a.usdValue || a.usd_value || balance),\n balance,\n });\n }\n\n // Vault positions\n for (const v of positionsRaw.vaults || []) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n currentPositions.push({\n venueType: 'VAULT',\n venueAddress: v.vaultAddress || v.vault_address || '',\n token: symbol,\n usdValue: parseFloat(v.usdValue || v.usd_value || balance),\n balance,\n });\n }\n\n // Pendle positions\n for (const p of positionsRaw.pendlePt || positionsRaw.pendle_pt || []) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n currentPositions.push({\n venueType: 'PENDLE_PT',\n venueAddress: p.marketAddress || p.market_address || '',\n token: symbol,\n usdValue: parseFloat(p.usdValue || p.usd_value || balance),\n balance,\n });\n }\n\n // Include idle balances\n let totalIdleUsd = 0;\n for (const [, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n totalIdleUsd += usdVal;\n }\n\n const totalPositionUsd = currentPositions.reduce((sum, p) => sum + p.usdValue, 0);\n const totalUsd = totalPositionUsd + totalIdleUsd;\n\n if (totalUsd <= 0) {\n throw new CompassServiceError('No portfolio value found to rebalance', 400);\n }\n\n // Fetch USD prices for all tokens involved\n const allTokenSymbols = new Set<string>();\n for (const pos of currentPositions) allTokenSymbols.add(pos.token.toUpperCase());\n for (const t of targets) if (t.token) allTokenSymbols.add(t.token.toUpperCase());\n for (const sym of Object.keys(balancesRaw.balances || {})) allTokenSymbols.add(sym.toUpperCase());\n\n const tokenPrices: Record<string, number> = {};\n const priceResults = await Promise.allSettled(\n [...allTokenSymbols].map(async (symbol) => {\n const resp = await this.client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n for (const result of priceResults) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n tokenPrices[result.value.symbol] = result.value.price;\n }\n }\n\n // Step 4: Compute actions\n const bundleActions: any[] = [];\n const actionsSummary: any[] = [];\n const warnings: string[] = [];\n\n const MIN_THRESHOLD_USD = 0.01;\n const CHANGE_THRESHOLD_PCT = 0.1;\n\n interface PendingDeposit {\n venue: any;\n venueAddress: string;\n token: string;\n deltaUsd: number;\n }\n const pendingDeposits: PendingDeposit[] = [];\n\n for (const target of targets) {\n const originalPct = target.originalPercent ?? target.targetPercent;\n if (Math.abs(target.targetPercent - originalPct) <= CHANGE_THRESHOLD_PCT) continue;\n\n const targetUsd = totalUsd * (target.targetPercent / 100);\n const current = currentPositions.find(\n p => p.venueType === target.venueType && p.venueAddress.toLowerCase() === target.venueAddress.toLowerCase()\n );\n const currentUsd = current?.usdValue || 0;\n const deltaUsd = targetUsd - currentUsd;\n\n if (Math.abs(deltaUsd) < MIN_THRESHOLD_USD) continue;\n\n if (deltaUsd < 0 && current) {\n const withdrawFraction = Math.abs(deltaUsd) / currentUsd;\n const withdrawAmount = (parseFloat(current.balance) * withdrawFraction).toString();\n\n let venue: any;\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, maxSlippagePercent: slippage };\n warnings.push(`Withdrawing from Pendle PT - check maturity implications`);\n }\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: withdrawAmount,\n },\n });\n\n actionsSummary.push({\n type: 'withdraw',\n venue: target.venueAddress,\n token: current.token,\n amount: withdrawAmount,\n usdValue: Math.abs(deltaUsd),\n });\n } else if (deltaUsd > 0) {\n let venue: any;\n const token = target.token || current?.token || '';\n\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, token, maxSlippagePercent: slippage };\n }\n\n pendingDeposits.push({ venue, venueAddress: target.venueAddress, token, deltaUsd });\n }\n }\n\n // Check for positions with implicit 0% target (full withdrawal)\n for (const current of currentPositions) {\n const hasTarget = targets.some(\n t => t.venueType === current.venueType && t.venueAddress.toLowerCase() === current.venueAddress.toLowerCase()\n );\n if (!hasTarget && current.usdValue >= MIN_THRESHOLD_USD) {\n let venue: any;\n if (current.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: current.venueAddress };\n } else if (current.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (current.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: current.venueAddress, maxSlippagePercent: slippage };\n }\n\n bundleActions.unshift({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: current.balance,\n },\n });\n\n actionsSummary.unshift({\n type: 'withdraw',\n venue: current.venueAddress,\n token: current.token,\n amount: current.balance,\n usdValue: current.usdValue,\n });\n }\n }\n\n // Step 5: Compute swap actions for token mismatches\n const availableByToken: Record<string, { usd: number; tokenAmount: number }> = {};\n\n for (const action of actionsSummary) {\n if (action.type === 'withdraw') {\n const key = action.token.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += action.usdValue;\n availableByToken[key].tokenAmount += parseFloat(action.amount);\n }\n }\n\n // Include idle balances\n for (const [tokenSymbol, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n const bal = parseFloat(td.balance_formatted || td.balanceFormatted || '0');\n if (usdVal > MIN_THRESHOLD_USD) {\n const key = tokenSymbol.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += usdVal;\n availableByToken[key].tokenAmount += bal;\n }\n }\n\n // Track deposit needs in USD by token\n const depositNeedsByToken: Record<string, number> = {};\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n depositNeedsByToken[key] = (depositNeedsByToken[key] || 0) + dep.deltaUsd;\n }\n\n // Generate swap actions for token shortfalls\n for (const [depositToken, neededUsd] of Object.entries(depositNeedsByToken)) {\n const availableUsd = availableByToken[depositToken]?.usd || 0;\n let shortfallUsd = neededUsd - availableUsd;\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) continue;\n\n for (const [sourceToken, sourceData] of Object.entries(availableByToken)) {\n if (sourceToken === depositToken) continue;\n\n const sourceNeeded = depositNeedsByToken[sourceToken] || 0;\n const sourceExcess = sourceData.usd - sourceNeeded;\n if (sourceExcess <= MIN_THRESHOLD_USD) continue;\n\n const swapUsd = Math.min(shortfallUsd, sourceExcess);\n if (swapUsd < MIN_THRESHOLD_USD) continue;\n\n const tokenAmountIn = sourceData.usd > 0\n ? (swapUsd / sourceData.usd) * sourceData.tokenAmount\n : (tokenPrices[sourceToken] ? swapUsd / tokenPrices[sourceToken] : swapUsd);\n\n bundleActions.push({\n body: {\n actionType: 'V2_SWAP',\n tokenIn: sourceToken,\n tokenOut: depositToken,\n amountIn: tokenAmountIn.toString(),\n slippage: slippage,\n },\n });\n\n actionsSummary.push({\n type: 'swap',\n token: sourceToken,\n tokenOut: depositToken,\n amount: tokenAmountIn,\n usdValue: swapUsd,\n });\n\n sourceData.usd -= swapUsd;\n sourceData.tokenAmount -= tokenAmountIn;\n const slippageFactor = 1 - (slippage / 100);\n if (!availableByToken[depositToken]) availableByToken[depositToken] = { usd: 0, tokenAmount: 0 };\n const receivedUsd = swapUsd * slippageFactor;\n const existingData = availableByToken[depositToken];\n const impliedPrice = (existingData.tokenAmount > 0 && existingData.usd > 0)\n ? existingData.usd / existingData.tokenAmount\n : (tokenPrices[depositToken] || 1);\n availableByToken[depositToken].usd += receivedUsd;\n availableByToken[depositToken].tokenAmount += receivedUsd / impliedPrice;\n\n shortfallUsd -= swapUsd;\n\n warnings.push(`Swap ${sourceToken} to ${depositToken} involves slippage risk`);\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) break;\n }\n }\n\n // Step 6: Create deposit actions from pending deposits\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n const available = availableByToken[key];\n const tokenPrice = (available && available.tokenAmount > 0 && available.usd > 0)\n ? available.usd / available.tokenAmount\n : (tokenPrices[key] || 1);\n const desiredTokens = dep.deltaUsd / tokenPrice;\n const maxAvailableTokens = available ? available.tokenAmount * 0.95 : 0;\n\n const maxAvailableUsd = maxAvailableTokens * tokenPrice;\n if (maxAvailableUsd <= MIN_THRESHOLD_USD) {\n warnings.push(`Skipping deposit to ${dep.token} - insufficient available balance`);\n continue;\n }\n\n const depositTokenAmount = Math.min(desiredTokens, maxAvailableTokens);\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue: dep.venue,\n action: 'DEPOSIT',\n amount: depositTokenAmount.toString(),\n },\n });\n\n const depositUsd = depositTokenAmount * tokenPrice;\n actionsSummary.push({\n type: 'deposit',\n venue: dep.venueAddress,\n token: dep.token,\n amount: depositTokenAmount.toString(),\n usdValue: depositUsd,\n });\n\n if (available) {\n available.usd -= depositUsd;\n available.tokenAmount -= depositTokenAmount;\n }\n }\n\n if (bundleActions.length === 0 && pendingDeposits.length === 0) {\n return {\n actions: [],\n actionsCount: 0,\n warnings: ['Portfolio is already at target allocation'],\n };\n }\n\n // Sort: withdrawals first, then swaps, then deposits\n bundleActions.sort((a, b) => {\n const getOrder = (action: any) => {\n if (action.body.action === 'WITHDRAW') return 0;\n if (action.body.actionType === 'V2_SWAP') return 1;\n if (action.body.action === 'DEPOSIT') return 2;\n return 3;\n };\n return getOrder(a) - getOrder(b);\n });\n\n actionsSummary.sort((a, b) => {\n const order: Record<string, number> = { withdraw: 0, swap: 1, deposit: 2 };\n return (order[a.type] || 0) - (order[b.type] || 0);\n });\n\n if (actionsSummary.some(a => a.type === 'swap')) {\n warnings.push('Swap amounts are estimates - actual amounts may vary due to slippage');\n }\n\n // Step 7: Call bundle endpoint\n const bundleResponse = await this.client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: bundleActions as any,\n });\n\n const eip712 = (bundleResponse as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from bundle API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actions: actionsSummary,\n actionsCount: bundleActions.length,\n warnings,\n };\n } catch (error) {\n if (error instanceof CompassServiceError) throw error;\n const message = error instanceof Error ? error.message : 'Failed to compute rebalance preview';\n throw new CompassServiceError(message, 502);\n }\n }\n\n // --- Credit ---\n\n async creditAccountCheck(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return {\n creditAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n };\n }\n\n async creditCreateAccount(body: { owner: string; chain?: string }) {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n\n if (!response.transaction) {\n return {\n creditAccountAddress,\n success: true,\n alreadyExists: true,\n };\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Account creation transaction reverted', 500);\n }\n\n return {\n creditAccountAddress,\n txHash,\n success: true,\n };\n }\n\n async creditPositions(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.credit.creditPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n return response;\n }\n\n async creditBalances(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const tokens = CREDIT_TOKENS[chain.toLowerCase()] || CREDIT_TOKENS['base'];\n const balances = await Promise.allSettled(\n tokens.map(async (token) => {\n const response = await this.client.token.tokenBalance({\n chain: chain as any,\n token,\n user: owner,\n });\n return {\n tokenSymbol: token,\n amount: (response as any).amount || '0',\n decimals: (response as any).decimals || 18,\n tokenAddress: (response as any).tokenAddress || '',\n };\n })\n );\n\n const result = balances\n .filter((b): b is PromiseFulfilledResult<any> => b.status === 'fulfilled')\n .map((b) => b.value);\n\n return result;\n }\n\n async creditBundlePrepare(body: {\n owner: string;\n chain?: string;\n actions: Array<Record<string, any>>;\n }) {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n throw new CompassServiceError('Missing owner or actions', 400);\n }\n\n const wrappedActions = actions.map((action: any) => ({ body: action }));\n\n const response = await this.client.credit.creditBundle({\n owner,\n chain: chain as any,\n gasSponsorship: true,\n actions: wrappedActions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n };\n }\n\n async creditTransfer(body: {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n }) {\n const { owner, chain = 'base', token, amount } = body;\n\n if (!owner || !token || !amount) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n const response = await this.client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action: 'DEPOSIT',\n gasSponsorship: true,\n } as any);\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes: Record<string, any> = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n };\n if (types.permitTransferFrom || types.PermitTransferFrom) {\n normalizedTypes.PermitTransferFrom = types.permitTransferFrom || types.PermitTransferFrom;\n }\n if (types.tokenPermissions || types.TokenPermissions) {\n normalizedTypes.TokenPermissions = types.tokenPermissions || types.TokenPermissions;\n }\n if (types.safeTx || types.SafeTx) {\n normalizedTypes.SafeTx = types.safeTx || types.SafeTx;\n }\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n };\n }\n\n async creditExecute(body: {\n owner: string;\n eip712: any;\n signature: string;\n chain?: string;\n creditAccountAddress: string;\n }) {\n const { owner, eip712, signature, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters (owner, eip712, signature)', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n product: 'credit',\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Transaction reverted', 500);\n }\n\n return { txHash, success: true };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/server/core/types.ts","../../../src/server/core/utils.ts","../../../src/server/core/compass-service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Chain } from 'viem';\nimport { mainnet, base, arbitrum } from 'viem/chains';\n\nexport const CHAIN_MAP: Record<string, Chain> = {\n ethereum: mainnet,\n base: base,\n arbitrum: arbitrum,\n};\n\nexport interface CompassHandlerConfig {\n /** Compass API key - keep this in environment variables */\n apiKey: string;\n /** Optional custom API server URL */\n serverUrl?: string;\n /** Gas sponsor private key (required for executing gas-sponsored transactions) */\n gasSponsorPrivateKey?: string;\n /** RPC URLs per chain (required for executing gas-sponsored transactions) */\n rpcUrls?: {\n ethereum?: string;\n base?: string;\n arbitrum?: string;\n };\n}\n\nexport const CREDIT_TOKENS: Record<string, string[]> = {\n base: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n ethereum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n arbitrum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n};\n","/**\n * Extracts a user-friendly error message from SDK/API errors.\n * SDK errors contain verbose technical data (Zod dumps, full HTTP bodies) that\n * should never be shown to end-users.\n */\nexport function extractErrorMessage(error: unknown): { message: string; status: number } {\n if (!(error instanceof Error)) {\n return { message: 'Something went wrong. Please try again.', status: 500 };\n }\n\n const raw = error.message || '';\n\n // SDK's CompassAPISDKError and subclasses embed a JSON body in the message.\n // Try to extract the API's own \"detail\" / \"error\" / \"description\" from it.\n const jsonMatch = raw.match(/Body:\\s*(\\{[\\s\\S]*\\})/);\n if (jsonMatch) {\n try {\n const body = JSON.parse(jsonMatch[1]);\n // FastAPI validation error -> detail is an array of {msg, loc, type}\n if (Array.isArray(body.detail)) {\n const msgs = body.detail.map((d: any) => d.msg || d.message).filter(Boolean);\n if (msgs.length > 0) return { message: msgs.join('. '), status: 422 };\n }\n // Single-string detail (e.g. \"Insufficient USDC balance\")\n if (typeof body.detail === 'string') return { message: body.detail, status: 422 };\n if (typeof body.error === 'string') return { message: body.error, status: 500 };\n if (typeof body.description === 'string') return { message: body.description, status: 500 };\n } catch {\n // JSON parse failed — fall through\n }\n }\n\n // SDKValidationError (Zod) — replace with generic message\n if (error.name === 'SDKValidationError' || raw.startsWith('Input validation failed')) {\n return { message: 'Invalid request data. Please check your inputs and try again.', status: 400 };\n }\n\n // Known user-facing patterns — return the line containing the pattern\n const knownPatterns = ['Insufficient', 'not deployed', 'reverted', 'not configured', 'Unsupported chain'];\n const lines = raw.split('\\n');\n for (const pattern of knownPatterns) {\n const matchingLine = lines.find(line => line.includes(pattern));\n if (matchingLine) {\n return { message: matchingLine.trim(), status: 500 };\n }\n }\n\n // Fallback — avoid leaking raw SDK internals\n return { message: 'Something went wrong. Please try again.', status: 500 };\n}\n\nexport function jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n","import { CompassApiSDK } from '@compass-labs/api-sdk';\nimport {\n createWalletClient,\n createPublicClient,\n http,\n type Hex,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { CompassHandlerConfig, CHAIN_MAP, CREDIT_TOKENS } from './types';\n\nexport class CompassServiceError extends Error {\n constructor(message: string, public statusCode: number) {\n super(message);\n this.name = 'CompassServiceError';\n }\n}\n\nexport class CompassCoreService {\n protected client: CompassApiSDK;\n protected config: CompassHandlerConfig;\n\n constructor(config: CompassHandlerConfig) {\n this.config = config;\n const { apiKey, serverUrl = 'https://api.compasslabs.ai' } = config;\n this.client = new CompassApiSDK({\n apiKeyAuth: apiKey,\n serverURL: serverUrl,\n });\n }\n\n // --- Earn ---\n\n async earnAccountCheck(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return {\n earnAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n };\n }\n\n async earnAccountBalances(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const data = response as any;\n\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n const balances: Record<string, { balance: string; usdValue: string }> = {};\n\n for (const [symbol, tokenData] of Object.entries(data.balances)) {\n const td = tokenData as any;\n const hasRealTransfers = td.transfers.some((t: any) => {\n const fromAddr = (t.from_address || t.fromAddress || '').toLowerCase();\n const toAddr = (t.to_address || t.toAddress || '').toLowerCase();\n return fromAddr !== ZERO_ADDRESS && toAddr !== ZERO_ADDRESS;\n });\n\n const balanceFormatted = td.balance_formatted || td.balanceFormatted || '0';\n const balanceNum = parseFloat(balanceFormatted);\n if (balanceNum === 0 && !hasRealTransfers) {\n continue;\n }\n\n if (!hasRealTransfers && td.transfers.length > 0) {\n continue;\n }\n\n const usdValue = td.usd_value || td.usdValue || '0';\n const usdValueNum = parseFloat(usdValue);\n if (usdValueNum === 0 || isNaN(usdValueNum)) {\n continue;\n }\n\n balances[symbol] = {\n balance: balanceFormatted,\n usdValue,\n };\n }\n\n const earnAccountAddr = data.earn_account_address || data.earnAccountAddress || '';\n const totalUsd = data.total_usd_value || data.totalUsdValue || '0';\n\n return {\n earnAccountAddress: earnAccountAddr,\n balances,\n totalUsdValue: totalUsd,\n };\n }\n\n async createAccount(body: { owner: string; chain?: string }) {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n\n if (!response.transaction) {\n return {\n earnAccountAddress,\n success: true,\n alreadyExists: true,\n };\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Account creation transaction reverted', 500);\n }\n\n return {\n earnAccountAddress,\n txHash,\n success: true,\n };\n }\n\n async managePrepare(body: {\n amount: string;\n token: string;\n owner: string;\n chain: string;\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n vaultAddress?: string;\n marketAddress?: string;\n maxSlippagePercent?: number;\n }, action: 'DEPOSIT' | 'WITHDRAW') {\n const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent } = body;\n\n let venue: any;\n\n if (venueType === 'VAULT' && vaultAddress) {\n venue = {\n type: 'VAULT' as const,\n vaultAddress,\n };\n } else if (venueType === 'AAVE') {\n venue = {\n type: 'AAVE' as const,\n token,\n };\n } else if (venueType === 'PENDLE_PT' && marketAddress) {\n venue = {\n type: 'PENDLE_PT' as const,\n marketAddress,\n token: action === 'DEPOSIT' ? token : undefined,\n maxSlippagePercent: maxSlippagePercent ?? 1.0,\n };\n } else {\n throw new CompassServiceError('Invalid venue type or missing address', 400);\n }\n\n const response = await this.client.earn.earnManage({\n owner,\n chain: chain as any,\n venue,\n action,\n amount,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n };\n }\n\n async execute(body: {\n owner: string;\n eip712: any;\n signature: string;\n chain: string;\n }) {\n const { owner, eip712, signature, chain } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n return { txHash, success: true };\n }\n\n // --- Transfer ---\n\n async transferApprove(body: { owner: string; chain?: string; token: string }) {\n const { owner, chain = 'base', token } = body;\n\n if (!owner || !token) {\n throw new CompassServiceError('Missing owner or token parameter', 400);\n }\n\n try {\n const response = await this.client.gasSponsorship.gasSponsorshipApproveTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712 || (response as any).eip_712;\n const transaction = (response as any).transaction;\n\n if (!eip712 && !transaction) {\n return {\n approved: true,\n message: 'Token already approved for Permit2',\n };\n }\n\n if (eip712) {\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n Permit: types.permit || types.Permit,\n };\n\n return {\n approved: false,\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n };\n }\n\n return {\n approved: false,\n transaction,\n requiresTransaction: true,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('already set') || errorMessage.includes('already been set')) {\n return {\n approved: true,\n message: 'Token allowance already set',\n };\n }\n throw error;\n }\n }\n\n async transferPrepare(body: {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\n product?: 'earn' | 'credit';\n recipient?: string;\n }) {\n const { owner, chain = 'base', token, amount, action, product, recipient } = body;\n const { gasSponsorPrivateKey } = this.config;\n\n if (!owner || !token || !amount || !action) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n let spender: string | undefined;\n if (action === 'DEPOSIT' && gasSponsorPrivateKey) {\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n spender = sponsorAccount.address;\n }\n\n let response: any;\n if (product === 'credit') {\n response = await this.client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n } else {\n response = await this.client.earn.earnTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n ...(recipient && action === 'WITHDRAW' && { recipient }),\n } as any);\n }\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n let normalizedTypes: Record<string, any>;\n\n if (action === 'DEPOSIT') {\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n PermitTransferFrom: types.permitTransferFrom || types.PermitTransferFrom,\n TokenPermissions: types.tokenPermissions || types.TokenPermissions,\n };\n } else {\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n }\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n };\n }\n\n async transferExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n }) {\n const { owner, chain = 'base', eip712, signature, product } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n ...(product === 'credit' && { product: 'credit' }),\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n return { txHash, success: true };\n }\n\n async approvalExecute(body: {\n owner: string;\n chain?: string;\n transaction: any;\n }) {\n const { owner, chain = 'base', transaction } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !transaction) {\n throw new CompassServiceError('Missing required parameters (owner, transaction)', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: 60_000,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Approval transaction reverted', 500);\n }\n\n return { txHash, status: 'success' };\n }\n\n // --- Swap ---\n\n async swapQuote(params: {\n owner?: string;\n chain?: string;\n tokenIn?: string;\n tokenOut?: string;\n amountIn?: string;\n }) {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn } = params;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n throw new CompassServiceError('Missing required parameters: owner, tokenIn, tokenOut, amountIn', 400);\n }\n\n try {\n const response = await this.client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage: 1.0,\n gasSponsorship: true,\n });\n\n const estimatedAmountOut = (response as any).estimatedAmountOut || '0';\n\n return {\n tokenIn,\n tokenOut,\n amountIn,\n estimatedAmountOut: estimatedAmountOut?.toString() || '0',\n };\n } catch (error: any) {\n let errorMessage = 'Failed to get swap quote';\n\n try {\n const bodyMessage = error?.body?.message || error?.message || '';\n\n if (bodyMessage.includes('{')) {\n const jsonMatch = bodyMessage.match(/\\{.*\\}/s);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;\n }\n } else if (bodyMessage) {\n const balanceMatch = bodyMessage.match(/Insufficient \\w+ balance[^.]+/i);\n if (balanceMatch) {\n errorMessage = balanceMatch[0];\n } else {\n errorMessage = bodyMessage;\n }\n }\n } catch {\n errorMessage = error?.body?.error || error?.message || 'Failed to get swap quote';\n }\n\n throw new CompassServiceError(errorMessage, 400);\n }\n }\n\n async swapPrepare(body: {\n owner: string;\n chain?: string;\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n slippage?: number;\n }) {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn, slippage = 1.0 } = body;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n throw new CompassServiceError('Missing required parameters: owner, tokenIn, tokenOut, amountIn', 400);\n }\n\n const response = await this.client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n estimatedAmountOut: (response as any).estimatedAmountOut?.toString() || '0',\n };\n }\n\n async swapExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n }) {\n const { owner, chain = 'base', eip712, signature } = body;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters: owner, eip712, signature', 400);\n }\n\n if (!this.config.gasSponsorPrivateKey) {\n throw new CompassServiceError('Gas sponsor not configured', 500);\n }\n\n const chainLower = chain.toLowerCase();\n const rpcUrl = this.config.rpcUrls?.[chainLower as keyof typeof this.config.rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const viemChain = CHAIN_MAP[chainLower];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 400);\n }\n\n const sponsorAccount = privateKeyToAccount(this.config.gasSponsorPrivateKey as `0x${string}`);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError('No transaction returned from gas sponsorship prepare', 500);\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Transaction reverted', 500);\n }\n\n return { txHash, success: true };\n }\n\n // --- Token ---\n\n async tokenBalance(params: { chain?: string; token?: string; address?: string }) {\n const { chain = 'base', token, address } = params;\n\n if (!token || !address) {\n throw new CompassServiceError('Missing token or address parameter', 400);\n }\n\n try {\n const response = await this.client.token.tokenBalance({\n chain: chain as any,\n token,\n user: address,\n });\n\n return {\n token,\n address,\n balance: (response as any).amount || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n };\n } catch {\n return {\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n };\n }\n }\n\n async tokenPrices(params: Record<string, string>) {\n const { chain = 'base', tokens } = params;\n\n if (!tokens) {\n throw new CompassServiceError('Missing tokens parameter', 400);\n }\n\n const tokenList = tokens.split(',').map((t) => t.trim().toUpperCase());\n const prices: Record<string, number> = {};\n\n const results = await Promise.allSettled(\n tokenList.map(async (symbol) => {\n const resp = await this.client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n prices[result.value.symbol] = result.value.price;\n }\n }\n\n return { prices };\n }\n\n // --- Bundle ---\n\n async bundlePrepare(body: {\n owner: string;\n chain?: string;\n actions: Array<{ actionType: string; [key: string]: any }>;\n }) {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n throw new CompassServiceError('Missing owner or actions', 400);\n }\n\n const response = await this.client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: actions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n };\n }\n\n async bundleExecute(body: {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n }) {\n return this.transferExecute(body);\n }\n\n // --- Data ---\n\n async vaults(params: {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n assetSymbol?: string;\n minTvlUsd?: string;\n }) {\n const { chain = 'base', orderBy = 'apy_7d', direction = 'desc', limit = '100', assetSymbol, minTvlUsd } = params;\n\n try {\n const response = await this.client.earn.earnVaults({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(assetSymbol && { assetSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch vaults', 500);\n }\n }\n\n async aaveMarkets(params: { chain?: string }) {\n const { chain = 'base' } = params;\n\n try {\n const response = await this.client.earn.earnAaveMarkets({\n chain: chain as any,\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch Aave markets', 500);\n }\n }\n\n async pendleMarkets(params: {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n underlyingSymbol?: string;\n minTvlUsd?: string;\n }) {\n const { chain = 'base', orderBy = 'implied_apy', direction = 'desc', limit = '100', underlyingSymbol, minTvlUsd } = params;\n\n try {\n const response = await this.client.earn.earnPendleMarkets({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(underlyingSymbol && { underlyingSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return response;\n } catch {\n throw new CompassServiceError('Failed to fetch Pendle markets', 500);\n }\n }\n\n async positions(params: { chain?: string; owner?: string }) {\n const { chain = 'base', owner } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n try {\n const positionsResponse = await this.client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const raw = JSON.parse(JSON.stringify(positionsResponse));\n\n const positions: any[] = [];\n\n // Aave positions\n const aavePositions = raw.aave || [];\n for (const a of aavePositions) {\n const balance = a.balance || '0';\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n const pnl = a.pnl;\n\n positions.push({\n protocol: 'aave',\n symbol,\n name: `${symbol} on Aave`,\n balance,\n balanceUsd: a.usdValue || a.usd_value || balance,\n apy: parseFloat(a.apy || '0'),\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (a.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (a.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Morpho vault positions\n const vaultPositions = raw.vaults || [];\n for (const v of vaultPositions) {\n const balance = v.balance || '0';\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n const vaultName = v.vaultName || v.vault_name || `${symbol} Vault`;\n const pnl = v.pnl;\n\n positions.push({\n protocol: 'vaults',\n symbol,\n name: vaultName,\n balance,\n balanceUsd: v.usdValue || v.usd_value || balance,\n apy: parseFloat(v.apy7d || v.apy_7d || '0'),\n vaultAddress: v.vaultAddress || v.vault_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (v.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (v.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Pendle positions\n const pendlePositions = raw.pendlePt || raw.pendle_pt || [];\n for (const p of pendlePositions) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n const pnl = p.pnl;\n\n positions.push({\n protocol: 'pendle',\n symbol,\n name: `PT-${symbol}`,\n balance,\n balanceUsd: p.usdValue || p.usd_value || balance,\n apy: parseFloat(p.impliedApy || p.implied_apy || '0'),\n marketAddress: p.marketAddress || p.market_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (p.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (p.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n return { positions };\n } catch {\n throw new CompassServiceError('Failed to fetch positions', 500);\n }\n }\n\n async txReceipt(params: Record<string, string>) {\n const { hash, chain } = params;\n\n if (!hash || !chain) {\n throw new CompassServiceError('Missing hash or chain parameter', 400);\n }\n\n const rpcUrl = this.config.rpcUrls?.[chain.toLowerCase() as keyof typeof this.config.rpcUrls];\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 400);\n }\n\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n try {\n const receipt = await publicClient.getTransactionReceipt({\n hash: hash as `0x${string}`,\n });\n return {\n status: receipt.status,\n blockNumber: receipt.blockNumber.toString(),\n };\n } catch {\n return { status: 'pending' };\n }\n }\n\n // --- Rebalance ---\n\n async rebalancePreview(body: {\n owner: string;\n chain?: string;\n targets: Array<{\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n venueAddress: string;\n targetPercent: number;\n token?: string;\n originalPercent?: number;\n }>;\n slippage?: number;\n }) {\n const { owner, chain = 'base', targets, slippage = 0.5 } = body;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!targets || targets.length === 0) {\n throw new CompassServiceError('Missing targets', 400);\n }\n\n for (const t of targets) {\n if (t.targetPercent < 0 || t.targetPercent > 100) {\n throw new CompassServiceError(`Invalid target percentage: ${t.targetPercent}%`, 400);\n }\n }\n\n try {\n // Step 1: Fetch current positions\n const positionsResponse = await this.client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const positionsRaw = JSON.parse(JSON.stringify(positionsResponse));\n\n // Step 2: Fetch current balances\n const balancesResponse = await this.client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const balancesRaw = JSON.parse(JSON.stringify(balancesResponse));\n\n // Step 3: Compute current portfolio USD values\n interface CurrentPosition {\n venueType: string;\n venueAddress: string;\n token: string;\n usdValue: number;\n balance: string;\n }\n\n const currentPositions: CurrentPosition[] = [];\n\n // Aave positions\n for (const a of positionsRaw.aave || []) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n currentPositions.push({\n venueType: 'AAVE',\n venueAddress: symbol,\n token: symbol,\n usdValue: parseFloat(a.usdValue || a.usd_value || balance),\n balance,\n });\n }\n\n // Vault positions\n for (const v of positionsRaw.vaults || []) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n currentPositions.push({\n venueType: 'VAULT',\n venueAddress: v.vaultAddress || v.vault_address || '',\n token: symbol,\n usdValue: parseFloat(v.usdValue || v.usd_value || balance),\n balance,\n });\n }\n\n // Pendle positions\n for (const p of positionsRaw.pendlePt || positionsRaw.pendle_pt || []) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n currentPositions.push({\n venueType: 'PENDLE_PT',\n venueAddress: p.marketAddress || p.market_address || '',\n token: symbol,\n usdValue: parseFloat(p.usdValue || p.usd_value || balance),\n balance,\n });\n }\n\n // Include idle balances\n let totalIdleUsd = 0;\n for (const [, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n totalIdleUsd += usdVal;\n }\n\n const totalPositionUsd = currentPositions.reduce((sum, p) => sum + p.usdValue, 0);\n const totalUsd = totalPositionUsd + totalIdleUsd;\n\n if (totalUsd <= 0) {\n throw new CompassServiceError('No portfolio value found to rebalance', 400);\n }\n\n // Fetch USD prices for all tokens involved\n const allTokenSymbols = new Set<string>();\n for (const pos of currentPositions) allTokenSymbols.add(pos.token.toUpperCase());\n for (const t of targets) if (t.token) allTokenSymbols.add(t.token.toUpperCase());\n for (const sym of Object.keys(balancesRaw.balances || {})) allTokenSymbols.add(sym.toUpperCase());\n\n const tokenPrices: Record<string, number> = {};\n const priceResults = await Promise.allSettled(\n [...allTokenSymbols].map(async (symbol) => {\n const resp = await this.client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n for (const result of priceResults) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n tokenPrices[result.value.symbol] = result.value.price;\n }\n }\n\n // Step 4: Compute actions\n const bundleActions: any[] = [];\n const actionsSummary: any[] = [];\n const warnings: string[] = [];\n\n const MIN_THRESHOLD_USD = 0.01;\n const CHANGE_THRESHOLD_PCT = 0.1;\n\n interface PendingDeposit {\n venue: any;\n venueAddress: string;\n token: string;\n deltaUsd: number;\n }\n const pendingDeposits: PendingDeposit[] = [];\n\n for (const target of targets) {\n const originalPct = target.originalPercent ?? target.targetPercent;\n if (Math.abs(target.targetPercent - originalPct) <= CHANGE_THRESHOLD_PCT) continue;\n\n const targetUsd = totalUsd * (target.targetPercent / 100);\n const current = currentPositions.find(\n p => p.venueType === target.venueType && p.venueAddress.toLowerCase() === target.venueAddress.toLowerCase()\n );\n const currentUsd = current?.usdValue || 0;\n const deltaUsd = targetUsd - currentUsd;\n\n if (Math.abs(deltaUsd) < MIN_THRESHOLD_USD) continue;\n\n if (deltaUsd < 0 && current) {\n const withdrawFraction = Math.abs(deltaUsd) / currentUsd;\n const withdrawAmount = (parseFloat(current.balance) * withdrawFraction).toString();\n\n let venue: any;\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, maxSlippagePercent: slippage };\n warnings.push(`Withdrawing from Pendle PT - check maturity implications`);\n }\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: withdrawAmount,\n },\n });\n\n actionsSummary.push({\n type: 'withdraw',\n venue: target.venueAddress,\n token: current.token,\n amount: withdrawAmount,\n usdValue: Math.abs(deltaUsd),\n });\n } else if (deltaUsd > 0) {\n let venue: any;\n const token = target.token || current?.token || '';\n\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, token, maxSlippagePercent: slippage };\n }\n\n pendingDeposits.push({ venue, venueAddress: target.venueAddress, token, deltaUsd });\n }\n }\n\n // Check for positions with implicit 0% target (full withdrawal)\n for (const current of currentPositions) {\n const hasTarget = targets.some(\n t => t.venueType === current.venueType && t.venueAddress.toLowerCase() === current.venueAddress.toLowerCase()\n );\n if (!hasTarget && current.usdValue >= MIN_THRESHOLD_USD) {\n let venue: any;\n if (current.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: current.venueAddress };\n } else if (current.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (current.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: current.venueAddress, maxSlippagePercent: slippage };\n }\n\n bundleActions.unshift({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: current.balance,\n },\n });\n\n actionsSummary.unshift({\n type: 'withdraw',\n venue: current.venueAddress,\n token: current.token,\n amount: current.balance,\n usdValue: current.usdValue,\n });\n }\n }\n\n // Step 5: Compute swap actions for token mismatches\n const availableByToken: Record<string, { usd: number; tokenAmount: number }> = {};\n\n for (const action of actionsSummary) {\n if (action.type === 'withdraw') {\n const key = action.token.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += action.usdValue;\n availableByToken[key].tokenAmount += parseFloat(action.amount);\n }\n }\n\n // Include idle balances\n for (const [tokenSymbol, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n const bal = parseFloat(td.balance_formatted || td.balanceFormatted || '0');\n if (usdVal > MIN_THRESHOLD_USD) {\n const key = tokenSymbol.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += usdVal;\n availableByToken[key].tokenAmount += bal;\n }\n }\n\n // Track deposit needs in USD by token\n const depositNeedsByToken: Record<string, number> = {};\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n depositNeedsByToken[key] = (depositNeedsByToken[key] || 0) + dep.deltaUsd;\n }\n\n // Generate swap actions for token shortfalls\n for (const [depositToken, neededUsd] of Object.entries(depositNeedsByToken)) {\n const availableUsd = availableByToken[depositToken]?.usd || 0;\n let shortfallUsd = neededUsd - availableUsd;\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) continue;\n\n for (const [sourceToken, sourceData] of Object.entries(availableByToken)) {\n if (sourceToken === depositToken) continue;\n\n const sourceNeeded = depositNeedsByToken[sourceToken] || 0;\n const sourceExcess = sourceData.usd - sourceNeeded;\n if (sourceExcess <= MIN_THRESHOLD_USD) continue;\n\n const swapUsd = Math.min(shortfallUsd, sourceExcess);\n if (swapUsd < MIN_THRESHOLD_USD) continue;\n\n const tokenAmountIn = sourceData.usd > 0\n ? (swapUsd / sourceData.usd) * sourceData.tokenAmount\n : (tokenPrices[sourceToken] ? swapUsd / tokenPrices[sourceToken] : swapUsd);\n\n bundleActions.push({\n body: {\n actionType: 'V2_SWAP',\n tokenIn: sourceToken,\n tokenOut: depositToken,\n amountIn: tokenAmountIn.toString(),\n slippage: slippage,\n },\n });\n\n actionsSummary.push({\n type: 'swap',\n token: sourceToken,\n tokenOut: depositToken,\n amount: tokenAmountIn,\n usdValue: swapUsd,\n });\n\n sourceData.usd -= swapUsd;\n sourceData.tokenAmount -= tokenAmountIn;\n const slippageFactor = 1 - (slippage / 100);\n if (!availableByToken[depositToken]) availableByToken[depositToken] = { usd: 0, tokenAmount: 0 };\n const receivedUsd = swapUsd * slippageFactor;\n const existingData = availableByToken[depositToken];\n const impliedPrice = (existingData.tokenAmount > 0 && existingData.usd > 0)\n ? existingData.usd / existingData.tokenAmount\n : (tokenPrices[depositToken] || 1);\n availableByToken[depositToken].usd += receivedUsd;\n availableByToken[depositToken].tokenAmount += receivedUsd / impliedPrice;\n\n shortfallUsd -= swapUsd;\n\n warnings.push(`Swap ${sourceToken} to ${depositToken} involves slippage risk`);\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) break;\n }\n }\n\n // Step 6: Create deposit actions from pending deposits\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n const available = availableByToken[key];\n const tokenPrice = (available && available.tokenAmount > 0 && available.usd > 0)\n ? available.usd / available.tokenAmount\n : (tokenPrices[key] || 1);\n const desiredTokens = dep.deltaUsd / tokenPrice;\n const maxAvailableTokens = available ? available.tokenAmount * 0.95 : 0;\n\n const maxAvailableUsd = maxAvailableTokens * tokenPrice;\n if (maxAvailableUsd <= MIN_THRESHOLD_USD) {\n warnings.push(`Skipping deposit to ${dep.token} - insufficient available balance`);\n continue;\n }\n\n const depositTokenAmount = Math.min(desiredTokens, maxAvailableTokens);\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue: dep.venue,\n action: 'DEPOSIT',\n amount: depositTokenAmount.toString(),\n },\n });\n\n const depositUsd = depositTokenAmount * tokenPrice;\n actionsSummary.push({\n type: 'deposit',\n venue: dep.venueAddress,\n token: dep.token,\n amount: depositTokenAmount.toString(),\n usdValue: depositUsd,\n });\n\n if (available) {\n available.usd -= depositUsd;\n available.tokenAmount -= depositTokenAmount;\n }\n }\n\n if (bundleActions.length === 0 && pendingDeposits.length === 0) {\n return {\n actions: [],\n actionsCount: 0,\n warnings: ['Portfolio is already at target allocation'],\n };\n }\n\n // Sort: withdrawals first, then swaps, then deposits\n bundleActions.sort((a, b) => {\n const getOrder = (action: any) => {\n if (action.body.action === 'WITHDRAW') return 0;\n if (action.body.actionType === 'V2_SWAP') return 1;\n if (action.body.action === 'DEPOSIT') return 2;\n return 3;\n };\n return getOrder(a) - getOrder(b);\n });\n\n actionsSummary.sort((a, b) => {\n const order: Record<string, number> = { withdraw: 0, swap: 1, deposit: 2 };\n return (order[a.type] || 0) - (order[b.type] || 0);\n });\n\n if (actionsSummary.some(a => a.type === 'swap')) {\n warnings.push('Swap amounts are estimates - actual amounts may vary due to slippage');\n }\n\n // Step 7: Call bundle endpoint\n const bundleResponse = await this.client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: bundleActions as any,\n });\n\n const eip712 = (bundleResponse as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from bundle API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actions: actionsSummary,\n actionsCount: bundleActions.length,\n warnings,\n };\n } catch (error) {\n if (error instanceof CompassServiceError) throw error;\n const message = error instanceof Error ? error.message : 'Failed to compute rebalance preview';\n throw new CompassServiceError(message, 502);\n }\n }\n\n // --- Credit ---\n\n async creditAccountCheck(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return {\n creditAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n };\n }\n\n async creditCreateAccount(body: { owner: string; chain?: string }) {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n\n if (!response.transaction) {\n return {\n creditAccountAddress,\n success: true,\n alreadyExists: true,\n };\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Account creation transaction reverted', 500);\n }\n\n return {\n creditAccountAddress,\n txHash,\n success: true,\n };\n }\n\n async creditPositions(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const response = await this.client.credit.creditPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n return response;\n }\n\n async creditBalances(params: { owner?: string; chain?: string }) {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n throw new CompassServiceError('Missing owner parameter', 400);\n }\n\n const tokens = CREDIT_TOKENS[chain.toLowerCase()] || CREDIT_TOKENS['base'];\n const balances = await Promise.allSettled(\n tokens.map(async (token) => {\n const response = await this.client.token.tokenBalance({\n chain: chain as any,\n token,\n user: owner,\n });\n return {\n tokenSymbol: token,\n amount: (response as any).amount || '0',\n decimals: (response as any).decimals || 18,\n tokenAddress: (response as any).tokenAddress || '',\n };\n })\n );\n\n const result = balances\n .filter((b): b is PromiseFulfilledResult<any> => b.status === 'fulfilled')\n .map((b) => b.value);\n\n return result;\n }\n\n async creditBundlePrepare(body: {\n owner: string;\n chain?: string;\n actions: Array<Record<string, any>>;\n }) {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n throw new CompassServiceError('Missing owner or actions', 400);\n }\n\n const wrappedActions = actions.map((action: any) => ({ body: action }));\n\n const response = await this.client.credit.creditBundle({\n owner,\n chain: chain as any,\n gasSponsorship: true,\n actions: wrappedActions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n };\n }\n\n async creditTransfer(body: {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n }) {\n const { owner, chain = 'base', token, amount } = body;\n\n if (!owner || !token || !amount) {\n throw new CompassServiceError('Missing required parameters', 400);\n }\n\n const response = await this.client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action: 'DEPOSIT',\n gasSponsorship: true,\n } as any);\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n throw new CompassServiceError('No EIP-712 data returned from API', 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes: Record<string, any> = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n };\n if (types.permitTransferFrom || types.PermitTransferFrom) {\n normalizedTypes.PermitTransferFrom = types.permitTransferFrom || types.PermitTransferFrom;\n }\n if (types.tokenPermissions || types.TokenPermissions) {\n normalizedTypes.TokenPermissions = types.tokenPermissions || types.TokenPermissions;\n }\n if (types.safeTx || types.SafeTx) {\n normalizedTypes.SafeTx = types.safeTx || types.SafeTx;\n }\n\n return {\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n };\n }\n\n async creditExecute(body: {\n owner: string;\n eip712: any;\n signature: string;\n chain?: string;\n creditAccountAddress: string;\n }) {\n const { owner, eip712, signature, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = this.config;\n\n if (!owner || !eip712 || !signature) {\n throw new CompassServiceError('Missing required parameters (owner, eip712, signature)', 400);\n }\n\n if (!gasSponsorPrivateKey) {\n throw new CompassServiceError(\n 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.',\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n throw new CompassServiceError(`Unsupported chain: ${chain}`, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n throw new CompassServiceError(`No RPC URL configured for chain: ${chain}`, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await this.client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n product: 'credit',\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n throw new CompassServiceError(\n 'No transaction returned from gas sponsorship prepare',\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new CompassServiceError('Transaction reverted', 500);\n }\n\n return { txHash, success: true };\n }\n}\n"]}
|