gmgn-cli 1.0.0
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/.claude-plugin/marketplace.json +45 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.cursor-plugin/plugin.json +23 -0
- package/LICENSE +21 -0
- package/Readme.md +236 -0
- package/Readme.zh.md +236 -0
- package/dist/client/OpenApiClient.d.ts +58 -0
- package/dist/client/OpenApiClient.d.ts.map +1 -0
- package/dist/client/OpenApiClient.js +174 -0
- package/dist/client/OpenApiClient.js.map +1 -0
- package/dist/client/signer.d.ts +32 -0
- package/dist/client/signer.d.ts.map +1 -0
- package/dist/client/signer.js +66 -0
- package/dist/client/signer.js.map +1 -0
- package/dist/commands/market.d.ts +3 -0
- package/dist/commands/market.d.ts.map +1 -0
- package/dist/commands/market.js +50 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/portfolio.d.ts +3 -0
- package/dist/commands/portfolio.d.ts.map +1 -0
- package/dist/commands/portfolio.js +112 -0
- package/dist/commands/portfolio.js.map +1 -0
- package/dist/commands/swap.d.ts +3 -0
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +73 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/commands/token.d.ts +3 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +62 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +3 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +22 -0
- package/dist/output.js.map +1 -0
- package/package.json +51 -0
- package/skills/gmgn-market/SKILL.md +144 -0
- package/skills/gmgn-portfolio/SKILL.md +105 -0
- package/skills/gmgn-swap/SKILL.md +142 -0
- package/skills/gmgn-token/SKILL.md +55 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenApiClient — GMGN OpenAPI external client
|
|
3
|
+
*
|
|
4
|
+
* Auth modes:
|
|
5
|
+
* Normal (market/token/portfolio): X-APIKEY + timestamp + client_id
|
|
6
|
+
* Critical (swap/order): normal auth + X-Signature (private key signature)
|
|
7
|
+
*/
|
|
8
|
+
import { buildAuthQuery, buildMessage, detectAlgorithm, sign } from "./signer.js";
|
|
9
|
+
export class OpenApiClient {
|
|
10
|
+
apiKey;
|
|
11
|
+
privateKeyPem;
|
|
12
|
+
host;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.apiKey = config.apiKey;
|
|
15
|
+
this.privateKeyPem = config.privateKeyPem;
|
|
16
|
+
this.host = config.host.replace(/\/$/, "");
|
|
17
|
+
}
|
|
18
|
+
// ---- Token endpoints (normal auth) ----
|
|
19
|
+
async getTokenInfo(chain, address) {
|
|
20
|
+
return this.normalRequest("GET", "/v1/token/info", { chain, address });
|
|
21
|
+
}
|
|
22
|
+
async getTokenSecurity(chain, address) {
|
|
23
|
+
return this.normalRequest("GET", "/v1/token/security", { chain, address });
|
|
24
|
+
}
|
|
25
|
+
async getTokenPoolInfo(chain, address) {
|
|
26
|
+
return this.normalRequest("GET", "/v1/token/pool_info", { chain, address });
|
|
27
|
+
}
|
|
28
|
+
async getTokenTopHolders(chain, address) {
|
|
29
|
+
return this.normalRequest("GET", "/v1/market/token_top_holders", { chain, address });
|
|
30
|
+
}
|
|
31
|
+
async getTokenTopTraders(chain, address) {
|
|
32
|
+
return this.normalRequest("GET", "/v1/market/token_top_traders", { chain, address });
|
|
33
|
+
}
|
|
34
|
+
// ---- Market endpoints (normal auth) ----
|
|
35
|
+
async getTokenKline(chain, address, resolution, from, to) {
|
|
36
|
+
return this.normalRequest("GET", "/v1/market/token_kline", { chain, address, resolution, from, to });
|
|
37
|
+
}
|
|
38
|
+
// ---- Portfolio endpoints (normal auth) ----
|
|
39
|
+
async getWalletHoldings(chain, walletAddress, extra = {}) {
|
|
40
|
+
return this.normalRequest("GET", "/v1/user/wallet_holdings", {
|
|
41
|
+
chain,
|
|
42
|
+
wallet_address: walletAddress,
|
|
43
|
+
...extra,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async getWalletActivity(chain, walletAddress, extra = {}) {
|
|
47
|
+
return this.normalRequest("GET", "/v1/user/wallet_activity", {
|
|
48
|
+
chain,
|
|
49
|
+
wallet_address: walletAddress,
|
|
50
|
+
...extra,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async getWalletStats(chain, walletAddresses, period = "7d") {
|
|
54
|
+
return this.normalRequest("GET", "/v1/user/wallet_stats", {
|
|
55
|
+
chain,
|
|
56
|
+
wallet_address: walletAddresses,
|
|
57
|
+
period,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async getWalletTokenBalance(chain, walletAddress, tokenAddress) {
|
|
61
|
+
return this.normalRequest("GET", "/v1/user/wallet_token_balance", { chain, wallet_address: walletAddress, token_address: tokenAddress });
|
|
62
|
+
}
|
|
63
|
+
// ---- Market trending endpoints (normal auth) ----
|
|
64
|
+
async getTrendingSwaps(chain, interval, extra = {}) {
|
|
65
|
+
return this.normalRequest("GET", "/v1/market/rank", { chain, interval, ...extra });
|
|
66
|
+
}
|
|
67
|
+
// ---- User endpoints (normal auth) ----
|
|
68
|
+
async getUserInfo() {
|
|
69
|
+
return this.normalRequest("GET", "/v1/user/info", {});
|
|
70
|
+
}
|
|
71
|
+
// ---- Swap endpoints (critical auth) ----
|
|
72
|
+
async swap(params) {
|
|
73
|
+
return this.criticalRequest("POST", "/v1/trade/swap", {}, params);
|
|
74
|
+
}
|
|
75
|
+
async queryOrder(orderId, chain) {
|
|
76
|
+
return this.criticalRequest("GET", "/v1/trade/query_order", { order_id: orderId, chain }, null);
|
|
77
|
+
}
|
|
78
|
+
// ---- Internal methods ----
|
|
79
|
+
async normalRequest(method, subPath, queryExtra, body = null) {
|
|
80
|
+
const { timestamp, client_id } = buildAuthQuery();
|
|
81
|
+
const query = { ...queryExtra, timestamp, client_id };
|
|
82
|
+
const url = buildUrl(`${this.host}${subPath}`, query);
|
|
83
|
+
const headers = {
|
|
84
|
+
"X-APIKEY": this.apiKey,
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
};
|
|
87
|
+
const bodyStr = body !== null ? JSON.stringify(body) : null;
|
|
88
|
+
const curlStr = formatCurl(method, url, headers, bodyStr);
|
|
89
|
+
const res = await this.doFetch(method, subPath, url, headers, bodyStr, curlStr);
|
|
90
|
+
return this.parseResponse(method, subPath, res, curlStr);
|
|
91
|
+
}
|
|
92
|
+
async criticalRequest(method, subPath, queryExtra, body) {
|
|
93
|
+
if (!this.privateKeyPem) {
|
|
94
|
+
throw new Error("GMGN_PRIVATE_KEY is required for swap/order commands");
|
|
95
|
+
}
|
|
96
|
+
const { timestamp, client_id } = buildAuthQuery();
|
|
97
|
+
const query = { ...queryExtra, timestamp, client_id };
|
|
98
|
+
const bodyStr = body !== null ? JSON.stringify(body) : "";
|
|
99
|
+
const message = buildMessage(subPath, query, bodyStr, timestamp);
|
|
100
|
+
const signature = sign(message, this.privateKeyPem, detectAlgorithm(this.privateKeyPem));
|
|
101
|
+
const url = buildUrl(`${this.host}${subPath}`, query);
|
|
102
|
+
const headers = {
|
|
103
|
+
"X-APIKEY": this.apiKey,
|
|
104
|
+
"X-Signature": signature,
|
|
105
|
+
"Content-Type": "application/json",
|
|
106
|
+
};
|
|
107
|
+
const curlStr = formatCurl(method, url, headers, bodyStr || null);
|
|
108
|
+
const res = await this.doFetch(method, subPath, url, headers, bodyStr || null, curlStr);
|
|
109
|
+
return this.parseResponse(method, subPath, res, curlStr);
|
|
110
|
+
}
|
|
111
|
+
async doFetch(method, subPath, url, headers, body, curlStr) {
|
|
112
|
+
try {
|
|
113
|
+
return await fetch(url, { method, headers, body: body ?? undefined });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const cause = err instanceof Error ? (err.cause ?? err) : err;
|
|
117
|
+
if (process.env.GMGN_DEBUG)
|
|
118
|
+
console.error(`${curlStr}\n[error] fetch failed: ${cause}`);
|
|
119
|
+
throw new Error(`${method} ${subPath} fetch failed: ${cause}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async parseResponse(method, path, res, curlStr) {
|
|
123
|
+
const fail = (msg, body = null) => {
|
|
124
|
+
if (process.env.GMGN_DEBUG) {
|
|
125
|
+
console.error(`${curlStr}\n${formatResponse(res, body)}`);
|
|
126
|
+
}
|
|
127
|
+
throw new Error(msg);
|
|
128
|
+
};
|
|
129
|
+
let text;
|
|
130
|
+
try {
|
|
131
|
+
text = await res.text();
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
fail(`${method} ${path} failed: HTTP ${res.status} (failed to read response body: ${err})`);
|
|
135
|
+
}
|
|
136
|
+
let json;
|
|
137
|
+
try {
|
|
138
|
+
json = JSON.parse(text);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
fail(`${method} ${path} failed: HTTP ${res.status} (non-JSON response)`, text);
|
|
142
|
+
}
|
|
143
|
+
if (json.code !== 0) {
|
|
144
|
+
fail(`${method} ${path} failed: HTTP ${res.status} code=${json.code} error=${json.error ?? ""} message=${json.message ?? ""}`, text);
|
|
145
|
+
}
|
|
146
|
+
return json.data;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function formatResponse(res, body) {
|
|
150
|
+
const headerLines = [...res.headers.entries()].map(([k, v]) => ` ${k}: ${v}`).join("\n");
|
|
151
|
+
return `[response] HTTP ${res.status}\n${headerLines}\n\n${body ?? "(no body)"}`;
|
|
152
|
+
}
|
|
153
|
+
const REDACTED_HEADERS = new Set(["x-apikey"]);
|
|
154
|
+
function formatCurl(method, url, headers, body) {
|
|
155
|
+
const headerArgs = Object.entries(headers)
|
|
156
|
+
.map(([k, v]) => ` -H '${k}: ${REDACTED_HEADERS.has(k.toLowerCase()) ? "***" : v}'`)
|
|
157
|
+
.join(" \\\n");
|
|
158
|
+
const bodyArg = body ? ` \\\n -d '${body.replace(/'/g, "'\\''")}'` : "";
|
|
159
|
+
return `\n[curl]\ncurl -X ${method} '${url}' \\\n${headerArgs}${bodyArg}\n`;
|
|
160
|
+
}
|
|
161
|
+
function buildUrl(base, query) {
|
|
162
|
+
const params = new URLSearchParams();
|
|
163
|
+
for (const [k, v] of Object.entries(query)) {
|
|
164
|
+
if (Array.isArray(v)) {
|
|
165
|
+
for (const item of v)
|
|
166
|
+
params.append(k, item);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
params.set(k, String(v));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return `${base}?${params.toString()}`;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=OpenApiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenApiClient.js","sourceRoot":"","sources":["../../src/client/OpenApiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type SignAlgorithm = "Ed25519" | "RSA-SHA256";
|
|
2
|
+
/**
|
|
3
|
+
* Detect signing algorithm from PEM private key
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectAlgorithm(pem: string): SignAlgorithm;
|
|
6
|
+
/**
|
|
7
|
+
* Build auth query params (timestamp + client_id)
|
|
8
|
+
* timestamp: Unix seconds, server validates within ±5s
|
|
9
|
+
* client_id: UUID, replays rejected within 7s
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildAuthQuery(): {
|
|
12
|
+
timestamp: number;
|
|
13
|
+
client_id: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Build the signature message (critical auth)
|
|
17
|
+
* Format: {sub_path}:{sorted_query_string}:{request_body}:{timestamp}
|
|
18
|
+
* sorted_query_string: all query params (including timestamp, client_id) sorted alphabetically by key
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildMessage(subPath: string, queryParams: Record<string, string | number>, body: string, timestamp: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Load private key file (PEM format)
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadPrivateKey(keyPath: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Sign a message and return the base64-encoded signature
|
|
27
|
+
*
|
|
28
|
+
* Ed25519: signs raw message bytes (no hashing)
|
|
29
|
+
* RSA-SHA256: RSA-PSS + SHA256, salt length = 32 (matches server-side rsa.VerifyPSS nil opts)
|
|
30
|
+
*/
|
|
31
|
+
export declare function sign(message: string, privateKeyPem: string, algorithm: SignAlgorithm): string;
|
|
32
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/client/signer.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;AAErD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAQ1D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAC5C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,aAAa,GACvB,MAAM,CAeR"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as crypto from "crypto";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
/**
|
|
5
|
+
* Detect signing algorithm from PEM private key
|
|
6
|
+
*/
|
|
7
|
+
export function detectAlgorithm(pem) {
|
|
8
|
+
const key = crypto.createPrivateKey(pem);
|
|
9
|
+
switch (key.asymmetricKeyType) {
|
|
10
|
+
case "ed25519": return "Ed25519";
|
|
11
|
+
case "rsa": return "RSA-SHA256";
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(`Unsupported key type: ${key.asymmetricKeyType}. Supported: Ed25519, RSA`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build auth query params (timestamp + client_id)
|
|
18
|
+
* timestamp: Unix seconds, server validates within ±5s
|
|
19
|
+
* client_id: UUID, replays rejected within 7s
|
|
20
|
+
*/
|
|
21
|
+
export function buildAuthQuery() {
|
|
22
|
+
return {
|
|
23
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
24
|
+
client_id: crypto.randomUUID(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build the signature message (critical auth)
|
|
29
|
+
* Format: {sub_path}:{sorted_query_string}:{request_body}:{timestamp}
|
|
30
|
+
* sorted_query_string: all query params (including timestamp, client_id) sorted alphabetically by key
|
|
31
|
+
*/
|
|
32
|
+
export function buildMessage(subPath, queryParams, body, timestamp) {
|
|
33
|
+
const sortedQs = Object.keys(queryParams)
|
|
34
|
+
.sort()
|
|
35
|
+
.map((k) => `${k}=${queryParams[k]}`)
|
|
36
|
+
.join("&");
|
|
37
|
+
return `${subPath}:${sortedQs}:${body}:${timestamp}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Load private key file (PEM format)
|
|
41
|
+
*/
|
|
42
|
+
export function loadPrivateKey(keyPath) {
|
|
43
|
+
const resolved = path.resolve(process.cwd(), keyPath);
|
|
44
|
+
return fs.readFileSync(resolved, "utf-8");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sign a message and return the base64-encoded signature
|
|
48
|
+
*
|
|
49
|
+
* Ed25519: signs raw message bytes (no hashing)
|
|
50
|
+
* RSA-SHA256: RSA-PSS + SHA256, salt length = 32 (matches server-side rsa.VerifyPSS nil opts)
|
|
51
|
+
*/
|
|
52
|
+
export function sign(message, privateKeyPem, algorithm) {
|
|
53
|
+
const msgBuf = Buffer.from(message, "utf-8");
|
|
54
|
+
if (algorithm === "Ed25519") {
|
|
55
|
+
const sig = crypto.sign(null, msgBuf, privateKeyPem);
|
|
56
|
+
return sig.toString("base64");
|
|
57
|
+
}
|
|
58
|
+
// RSA-SHA256 with PSS padding, salt length = digest length (32)
|
|
59
|
+
const sig = crypto.sign("sha256", msgBuf, {
|
|
60
|
+
key: privateKeyPem,
|
|
61
|
+
padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
|
|
62
|
+
saltLength: 32,
|
|
63
|
+
});
|
|
64
|
+
return sig.toString("base64");
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/client/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,QAAQ,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC9B,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,KAAK,CAAC,CAAK,OAAO,YAAY,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,iBAAiB,2BAA2B,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACxC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,WAA4C,EAC5C,IAAY,EACZ,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;SACtC,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,OAAO,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAClB,OAAe,EACf,aAAqB,EACrB,SAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,gEAAgE;IAChE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;QACxC,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB;QAC/C,UAAU,EAAE,EAAE;KACf,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C7D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { OpenApiClient } from "../client/OpenApiClient.js";
|
|
2
|
+
import { getConfig } from "../config.js";
|
|
3
|
+
import { exitOnError, printResult } from "../output.js";
|
|
4
|
+
export function registerMarketCommands(program) {
|
|
5
|
+
const market = program.command("market").description("Market data commands");
|
|
6
|
+
market
|
|
7
|
+
.command("kline")
|
|
8
|
+
.description("Get token K-line (candlestick) data")
|
|
9
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
10
|
+
.requiredOption("--address <address>", "Token contract address")
|
|
11
|
+
.requiredOption("--resolution <resolution>", "Candlestick resolution: 1m / 5m / 15m / 1h / 4h / 1d")
|
|
12
|
+
.requiredOption("--from <timestamp>", "Start time (Unix seconds)", parseInt)
|
|
13
|
+
.requiredOption("--to <timestamp>", "End time (Unix seconds)", parseInt)
|
|
14
|
+
.option("--raw", "Output raw JSON")
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
const client = new OpenApiClient(getConfig());
|
|
17
|
+
const data = await client
|
|
18
|
+
.getTokenKline(opts.chain, opts.address, opts.resolution, opts.from * 1000, opts.to * 1000)
|
|
19
|
+
.catch(exitOnError);
|
|
20
|
+
printResult(data, opts.raw);
|
|
21
|
+
});
|
|
22
|
+
market
|
|
23
|
+
.command("trending")
|
|
24
|
+
.description("Get trending token swap data")
|
|
25
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
26
|
+
.requiredOption("--interval <interval>", "Time interval: 1h / 3h / 6h / 24h")
|
|
27
|
+
.option("--limit <n>", "Number of results (default 100, max 100)", parseInt)
|
|
28
|
+
.option("--orderby <field>", "Sort field: score / volume / swaps / liquidity / marketcap / holders / price / change / ...")
|
|
29
|
+
.option("--direction <dir>", "Sort direction: asc / desc")
|
|
30
|
+
.option("--filter <tag...>", "Filter tags, repeatable: has_social / not_risk / not_honeypot / verified / locked / renounced / ...")
|
|
31
|
+
.option("--platform <name...>", "Platform filter, repeatable: pump / moonshot / ...")
|
|
32
|
+
.option("--raw", "Output raw JSON")
|
|
33
|
+
.action(async (opts) => {
|
|
34
|
+
const extra = {};
|
|
35
|
+
if (opts.limit != null)
|
|
36
|
+
extra["limit"] = opts.limit;
|
|
37
|
+
if (opts.orderby)
|
|
38
|
+
extra["order_by"] = opts.orderby;
|
|
39
|
+
if (opts.direction)
|
|
40
|
+
extra["direction"] = opts.direction;
|
|
41
|
+
if (opts.filter?.length)
|
|
42
|
+
extra["filters"] = opts.filter;
|
|
43
|
+
if (opts.platform?.length)
|
|
44
|
+
extra["platforms"] = opts.platform;
|
|
45
|
+
const client = new OpenApiClient(getConfig());
|
|
46
|
+
const data = await client.getTrendingSwaps(opts.chain, opts.interval, extra).catch(exitOnError);
|
|
47
|
+
printResult(data, opts.raw);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/commands/market.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/commands/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkGhE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { OpenApiClient } from "../client/OpenApiClient.js";
|
|
2
|
+
import { getConfig } from "../config.js";
|
|
3
|
+
import { exitOnError, printResult } from "../output.js";
|
|
4
|
+
export function registerPortfolioCommands(program) {
|
|
5
|
+
const portfolio = program.command("portfolio").description("Wallet portfolio commands");
|
|
6
|
+
portfolio
|
|
7
|
+
.command("holdings")
|
|
8
|
+
.description("Get wallet token holdings")
|
|
9
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
10
|
+
.requiredOption("--wallet <address>", "Wallet address")
|
|
11
|
+
.option("--limit <n>", "Page size (default 20, max 50)", parseInt, 20)
|
|
12
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
13
|
+
.option("--order-by <field>", "Sort field: usd_value / price / price_change / unrealized_profit / realized_profit / ...", "usd_value")
|
|
14
|
+
.option("--direction <dir>", "Sort direction: asc / desc", "desc")
|
|
15
|
+
.option("--interval <interval>", "Stats interval (default 24h)")
|
|
16
|
+
.option("--sell-out", "Include sold-out positions")
|
|
17
|
+
.option("--show-small", "Include small-value positions")
|
|
18
|
+
.option("--hide-abnormal", "Hide abnormal positions")
|
|
19
|
+
.option("--hide-airdrop", "Hide airdrop positions")
|
|
20
|
+
.option("--hide-closed", "Hide closed positions")
|
|
21
|
+
.option("--hide-open", "Hide open positions")
|
|
22
|
+
.option("--tx30d", "Only show positions with trades in last 30 days")
|
|
23
|
+
.option("--raw", "Output raw JSON")
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
const extra = {};
|
|
26
|
+
if (opts.limit != null)
|
|
27
|
+
extra["limit"] = opts.limit;
|
|
28
|
+
if (opts.cursor)
|
|
29
|
+
extra["cursor"] = opts.cursor;
|
|
30
|
+
if (opts.orderBy)
|
|
31
|
+
extra["order_by"] = opts.orderBy;
|
|
32
|
+
if (opts.direction)
|
|
33
|
+
extra["direction"] = opts.direction;
|
|
34
|
+
if (opts.interval)
|
|
35
|
+
extra["interval"] = opts.interval;
|
|
36
|
+
if (opts.sellOut)
|
|
37
|
+
extra["sell_out"] = "true";
|
|
38
|
+
if (opts.showSmall)
|
|
39
|
+
extra["show_small"] = "true";
|
|
40
|
+
if (opts.hideAbnormal)
|
|
41
|
+
extra["hide_abnormal"] = "true";
|
|
42
|
+
if (opts.hideAirdrop)
|
|
43
|
+
extra["hide_airdrop"] = "true";
|
|
44
|
+
if (opts.hideClosed)
|
|
45
|
+
extra["hide_closed"] = "true";
|
|
46
|
+
if (opts.hideOpen)
|
|
47
|
+
extra["hide_open"] = "true";
|
|
48
|
+
if (opts.tx30d)
|
|
49
|
+
extra["tx30d"] = "true";
|
|
50
|
+
const client = new OpenApiClient(getConfig());
|
|
51
|
+
const data = await client.getWalletHoldings(opts.chain, opts.wallet, extra).catch(exitOnError);
|
|
52
|
+
printResult(data, opts.raw);
|
|
53
|
+
});
|
|
54
|
+
portfolio
|
|
55
|
+
.command("activity")
|
|
56
|
+
.description("Get wallet transaction activity")
|
|
57
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
58
|
+
.requiredOption("--wallet <address>", "Wallet address")
|
|
59
|
+
.option("--token <address>", "Filter by token contract address")
|
|
60
|
+
.option("--limit <n>", "Page size", parseInt)
|
|
61
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
62
|
+
.option("--type <type...>", "Activity type filter, repeatable: buy / sell / add / remove / transfer")
|
|
63
|
+
.option("--raw", "Output raw JSON")
|
|
64
|
+
.action(async (opts) => {
|
|
65
|
+
const extra = {};
|
|
66
|
+
if (opts.token)
|
|
67
|
+
extra["token"] = opts.token;
|
|
68
|
+
if (opts.limit != null)
|
|
69
|
+
extra["limit"] = opts.limit;
|
|
70
|
+
if (opts.cursor)
|
|
71
|
+
extra["cursor"] = opts.cursor;
|
|
72
|
+
if (opts.type?.length)
|
|
73
|
+
extra["type"] = opts.type;
|
|
74
|
+
const client = new OpenApiClient(getConfig());
|
|
75
|
+
const data = await client.getWalletActivity(opts.chain, opts.wallet, extra).catch(exitOnError);
|
|
76
|
+
printResult(data, opts.raw);
|
|
77
|
+
});
|
|
78
|
+
portfolio
|
|
79
|
+
.command("stats")
|
|
80
|
+
.description("Get wallet trading statistics (supports multiple wallets)")
|
|
81
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
82
|
+
.requiredOption("--wallet <address...>", "Wallet address(es), repeatable")
|
|
83
|
+
.option("--period <period>", "Stats period: 7d / 30d", "7d")
|
|
84
|
+
.option("--raw", "Output raw JSON")
|
|
85
|
+
.action(async (opts) => {
|
|
86
|
+
const client = new OpenApiClient(getConfig());
|
|
87
|
+
const data = await client.getWalletStats(opts.chain, opts.wallet, opts.period).catch(exitOnError);
|
|
88
|
+
printResult(data, opts.raw);
|
|
89
|
+
});
|
|
90
|
+
portfolio
|
|
91
|
+
.command("info")
|
|
92
|
+
.description("Get wallets and main currency balances bound to the API Key")
|
|
93
|
+
.option("--raw", "Output raw JSON")
|
|
94
|
+
.action(async (opts) => {
|
|
95
|
+
const client = new OpenApiClient(getConfig());
|
|
96
|
+
const data = await client.getUserInfo().catch(exitOnError);
|
|
97
|
+
printResult(data, opts.raw);
|
|
98
|
+
});
|
|
99
|
+
portfolio
|
|
100
|
+
.command("token-balance")
|
|
101
|
+
.description("Get wallet token balance for a single token")
|
|
102
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
|
|
103
|
+
.requiredOption("--wallet <address>", "Wallet address")
|
|
104
|
+
.requiredOption("--token <address>", "Token contract address")
|
|
105
|
+
.option("--raw", "Output raw JSON")
|
|
106
|
+
.action(async (opts) => {
|
|
107
|
+
const client = new OpenApiClient(getConfig());
|
|
108
|
+
const data = await client.getWalletTokenBalance(opts.chain, opts.wallet, opts.token).catch(exitOnError);
|
|
109
|
+
printResult(data, opts.raw);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/commands/portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/commands/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D3D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { OpenApiClient } from "../client/OpenApiClient.js";
|
|
2
|
+
import { getConfig } from "../config.js";
|
|
3
|
+
import { exitOnError, printResult } from "../output.js";
|
|
4
|
+
export function registerSwapCommands(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("swap")
|
|
7
|
+
.description("Submit a token swap")
|
|
8
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base / eth ")
|
|
9
|
+
.requiredOption("--from <address>", "Wallet address (must match API Key binding)")
|
|
10
|
+
.requiredOption("--input-token <address>", "Input token contract address")
|
|
11
|
+
.requiredOption("--output-token <address>", "Output token contract address")
|
|
12
|
+
.option("--amount <amount>", "Input raw amount (smallest unit)")
|
|
13
|
+
.option("--percent <pct>", "Input amount as a percentage, e.g. 50 = 50%, 1 = 1%; only valid when input_token is NOT a currency", parseFloat)
|
|
14
|
+
.option("--slippage <n>", "Slippage tolerance (e.g. 0.01 = 1%)", parseFloat)
|
|
15
|
+
.option("--min-output <amount>", "Minimum output amount")
|
|
16
|
+
.option("--anti-mev", "Enable anti-MEV protection, default true")
|
|
17
|
+
.option("--priority-fee <sol>", "Priority fee in SOL (≥ 0.00001, SOL only)")
|
|
18
|
+
.option("--tip-fee <amount>", "Tip fee (SOL ≥ 0.00001 SOL / BSC ≥ 0.000001 BNB)")
|
|
19
|
+
.option("--max-auto-fee <amount>", "Max auto fee cap")
|
|
20
|
+
.option("--gas-price <gwei>", "Gas price in gwei (BSC ≥ 0.05 / BASE/ETH ≥ 0.01)")
|
|
21
|
+
.option("--max-fee-per-gas <amount>", "EIP-1559 max fee per gas (Base)")
|
|
22
|
+
.option("--max-priority-fee-per-gas <amount>", "EIP-1559 max priority fee per gas (Base)")
|
|
23
|
+
.option("--raw", "Output raw JSON")
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
if (opts.percent == null && !opts.amount) {
|
|
26
|
+
console.error("[gmgn-cli] Either --amount or --percent must be provided");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const params = {
|
|
30
|
+
chain: opts.chain,
|
|
31
|
+
from_address: opts.from,
|
|
32
|
+
input_token: opts.inputToken,
|
|
33
|
+
output_token: opts.outputToken,
|
|
34
|
+
input_amount: opts.percent != null ? (opts.amount ?? "0") : opts.amount,
|
|
35
|
+
};
|
|
36
|
+
if (opts.percent != null)
|
|
37
|
+
params.input_amount_bps = String(Math.round(opts.percent * 100));
|
|
38
|
+
if (opts.slippage != null)
|
|
39
|
+
params.slippage = opts.slippage;
|
|
40
|
+
if (opts.minOutput)
|
|
41
|
+
params.min_output_amount = opts.minOutput;
|
|
42
|
+
if (opts.antiMev)
|
|
43
|
+
params.is_anti_mev = true;
|
|
44
|
+
if (opts.priorityFee)
|
|
45
|
+
params.priority_fee = opts.priorityFee;
|
|
46
|
+
if (opts.tipFee)
|
|
47
|
+
params.tip_fee = opts.tipFee;
|
|
48
|
+
if (opts.maxAutoFee)
|
|
49
|
+
params.max_auto_fee = opts.maxAutoFee;
|
|
50
|
+
if (opts.gasPrice)
|
|
51
|
+
params.gas_price = String(Math.round(parseFloat(opts.gasPrice) * 1e9));
|
|
52
|
+
if (opts.maxFeePerGas)
|
|
53
|
+
params.max_fee_per_gas = opts.maxFeePerGas;
|
|
54
|
+
if (opts.maxPriorityFeePerGas)
|
|
55
|
+
params.max_priority_fee_per_gas = opts.maxPriorityFeePerGas;
|
|
56
|
+
const client = new OpenApiClient(getConfig(true));
|
|
57
|
+
const data = await client.swap(params).catch(exitOnError);
|
|
58
|
+
printResult(data, opts.raw);
|
|
59
|
+
});
|
|
60
|
+
const order = program.command("order").description("Order management commands");
|
|
61
|
+
order
|
|
62
|
+
.command("get")
|
|
63
|
+
.description("Query order status (requires private key)")
|
|
64
|
+
.requiredOption("--chain <chain>", "Chain: sol / bsc / base / eth / monad")
|
|
65
|
+
.requiredOption("--order-id <id>", "Order ID")
|
|
66
|
+
.option("--raw", "Output raw JSON")
|
|
67
|
+
.action(async (opts) => {
|
|
68
|
+
const client = new OpenApiClient(getConfig(true));
|
|
69
|
+
const data = await client.queryOrder(opts.orderId, opts.chain).catch(exitOnError);
|
|
70
|
+
printResult(data, opts.raw);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/commands/swap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8D5D"}
|