fix bsc order quote auth

This commit is contained in:
deepfeature
2026-04-08 17:19:16 +08:00
parent fce314b9ab
commit ca3c640afc
7 changed files with 48 additions and 22 deletions
+7 -5
View File
@@ -3,7 +3,7 @@
*
* Auth modes:
* Normal (market/token/portfolio): X-APIKEY + timestamp + client_id
* Critical (swap/order): normal auth + X-Signature (private key signature)
* Critical (swap, order get/strategy, BSC order quote): normal auth + X-Signature (private key signature)
*/
import { buildAuthQuery, buildMessage, detectAlgorithm, sign } from "./signer.js";
@@ -293,9 +293,11 @@ export class OpenApiClient {
input_amount: string,
slippage: number
): Promise<unknown> {
return this.normalRequest("GET", "/v1/trade/quote", {
chain, from_address, input_token, output_token, input_amount, slippage,
});
const query = { chain, from_address, input_token, output_token, input_amount, slippage };
if (chain === "bsc") {
return this.criticalRequest("GET", "/v1/trade/quote", query, null);
}
return this.normalRequest("GET", "/v1/trade/quote", query);
}
// ---- Swap endpoints (critical auth) ----
@@ -367,7 +369,7 @@ export class OpenApiClient {
body: unknown
): Promise<unknown> {
if (!this.privateKeyPem) {
throw new Error("GMGN_PRIVATE_KEY is required for swap/order commands");
throw new Error("GMGN_PRIVATE_KEY is required for critical-auth commands (swap, order get/strategy, and order quote on BSC)");
}
return this.executePreparedRequest(() => {
+3 -3
View File
@@ -75,8 +75,8 @@ export function registerSwapCommands(program: Command): void {
order
.command("quote")
.description("Get a swap quote without submitting a transaction")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
.description("Get a swap quote without submitting a transaction (BSC uses critical auth)")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base (BSC quote requires GMGN_PRIVATE_KEY)")
.requiredOption("--from <address>", "Wallet address (must match API Key binding)")
.requiredOption("--input-token <address>", "Input token contract address")
.requiredOption("--output-token <address>", "Output token contract address")
@@ -89,7 +89,7 @@ export function registerSwapCommands(program: Command): void {
validateAddress(opts.inputToken, opts.chain, "--input-token");
validateAddress(opts.outputToken, opts.chain, "--output-token");
validatePositiveInt(opts.amount, "--amount");
const client = new OpenApiClient(getConfig());
const client = new OpenApiClient(getConfig(opts.chain === "bsc"));
const data = await client
.quoteOrder(opts.chain, opts.from, opts.inputToken, opts.outputToken, opts.amount, opts.slippage)
.catch(exitOnError);
+4 -2
View File
@@ -14,11 +14,13 @@ export interface Config {
}
let _config: Config | null = null;
const PRIVATE_KEY_REQUIRED_MSG =
"GMGN_PRIVATE_KEY is required for critical-auth commands (swap, order get/strategy, and order quote on BSC)";
export function getConfig(requirePrivateKey = false): Config {
if (_config) {
if (requirePrivateKey && !_config.privateKeyPem) {
die("GMGN_PRIVATE_KEY is required for swap/order commands");
die(PRIVATE_KEY_REQUIRED_MSG);
}
return _config;
}
@@ -34,7 +36,7 @@ export function getConfig(requirePrivateKey = false): Config {
// Support escaped newlines (e.g. from single-line .env values)
privateKeyPem = privateKey.replace(/\\n/g, "\n");
} else if (requirePrivateKey) {
die("GMGN_PRIVATE_KEY is required for swap/order commands");
die(PRIVATE_KEY_REQUIRED_MSG);
}
const host = process.env.GMGN_HOST ?? "https://openapi.gmgn.ai";