typescript
import { z } from "zod";
import { store } from "opentool/store";
import { wallet } from "opentool/wallet";
import {
HyperliquidApiError,
resolveHyperliquidChainConfig,
setHyperliquidDexAbstraction,
} from "opentool/adapters/hyperliquid";
import type { WalletFullContext } from "opentool/wallet";
export const profile = {
description:
"Enable/disable HIP-3 DEX abstraction for the configured Turnkey wallet.",
};
export const schema = z.object({
enabled: z.boolean().default(true),
environment: z.enum(["mainnet", "testnet"]).default("testnet"),
});
export async function POST(req: Request): Promise<Response> {
try {
const body = await req.json().catch(() => ({}));
const { enabled, 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 result = await setHyperliquidDexAbstraction({
wallet: context as WalletFullContext,
environment,
enabled,
user,
});
await store({
source: "hyperliquid",
ref: `dex-abstraction-${Date.now()}`,
status: "submitted",
walletAddress: user,
action: "dex-abstraction",
network: environment === "mainnet" ? "hyperliquid" : "hyperliquid-testnet",
metadata: {
environment,
enabled,
user,
result,
},
});
return Response.json({
ok: true,
environment,
enabled,
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: "dex-abstraction@v2",
},
{ status: 400 }
);
}
}