OpenPond
1Branch0Tags
GL
glucryptoMerge commit 'refs/tmp/prod-master'
typescript
import { z } from "zod"; import { store } from "opentool/store"; import { wallet } from "opentool/wallet"; import { HyperliquidApiError, resolveHyperliquidChainConfig, resolveHyperliquidAbstractionFromMode, setHyperliquidAccountAbstractionMode, type HyperliquidAccountMode, } from "opentool/adapters/hyperliquid"; import type { WalletFullContext } from "opentool/wallet"; export const profile = { description: "Set Hyperliquid account abstraction mode (Standard/Unified/Portfolio) for the configured wallet (signs HyperliquidTransaction:UserSetAbstraction).", }; export const schema = z.object({ mode: z.enum(["standard", "unified", "portfolio"]).default("unified"), environment: z.enum(["mainnet", "testnet"]).default("testnet"), }); export async function POST(req: Request): Promise<Response> { try { const body = await req.json().catch(() => ({})); const { mode, environment } = schema.parse(body); const chainConfig = resolveHyperliquidChainConfig(environment); const context = await wallet({ chain: chainConfig.chain, rpcUrl: chainConfig.rpcUrl ?? process.env.RPC_URL, }); const user = context.address as `0x${string}`; const abstraction = resolveHyperliquidAbstractionFromMode( mode as HyperliquidAccountMode ); const result = await setHyperliquidAccountAbstractionMode({ wallet: context as WalletFullContext, environment, mode: mode as HyperliquidAccountMode, user, }); await store({ source: "hyperliquid", ref: `account-mode-${Date.now()}`, status: "submitted", walletAddress: user, action: "account-mode", network: environment === "mainnet" ? "hyperliquid" : "hyperliquid-testnet", metadata: { environment, mode, abstraction, user, result, }, }); return Response.json({ ok: true, environment, mode, abstraction, user, result, }); } catch (error) { const err = error as { message?: unknown; response?: unknown; cause?: unknown }; const message = typeof err?.message === "string" ? err.message : "Unknown error"; const exchangeResponse = err?.response ?? (error instanceof HyperliquidApiError ? error.response : null); return Response.json( { ok: false, error: message, exchangeResponse, debug: "account-mode@v1", }, { status: 400 } ); } }