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 }
);
}
}