@goplus/agentguard 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/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/action/detectors/exec.d.ts +21 -0
- package/dist/action/detectors/exec.d.ts.map +1 -0
- package/dist/action/detectors/exec.js +201 -0
- package/dist/action/detectors/exec.js.map +1 -0
- package/dist/action/detectors/index.d.ts +4 -0
- package/dist/action/detectors/index.d.ts.map +1 -0
- package/dist/action/detectors/index.js +20 -0
- package/dist/action/detectors/index.js.map +1 -0
- package/dist/action/detectors/network.d.ts +21 -0
- package/dist/action/detectors/network.d.ts.map +1 -0
- package/dist/action/detectors/network.js +152 -0
- package/dist/action/detectors/network.js.map +1 -0
- package/dist/action/detectors/secret-leak.d.ts +28 -0
- package/dist/action/detectors/secret-leak.d.ts.map +1 -0
- package/dist/action/detectors/secret-leak.js +94 -0
- package/dist/action/detectors/secret-leak.js.map +1 -0
- package/dist/action/goplus/client.d.ts +151 -0
- package/dist/action/goplus/client.d.ts.map +1 -0
- package/dist/action/goplus/client.js +187 -0
- package/dist/action/goplus/client.js.map +1 -0
- package/dist/action/index.d.ts +61 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +643 -0
- package/dist/action/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +410 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/policy/default.d.ts +77 -0
- package/dist/policy/default.d.ts.map +1 -0
- package/dist/policy/default.js +94 -0
- package/dist/policy/default.js.map +1 -0
- package/dist/registry/index.d.ts +93 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +280 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/storage.d.ts +69 -0
- package/dist/registry/storage.d.ts.map +1 -0
- package/dist/registry/storage.js +208 -0
- package/dist/registry/storage.js.map +1 -0
- package/dist/registry/trust.d.ts +41 -0
- package/dist/registry/trust.d.ts.map +1 -0
- package/dist/registry/trust.js +139 -0
- package/dist/registry/trust.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +34 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +134 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +67 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +349 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/rules/exfiltration.d.ts +6 -0
- package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
- package/dist/scanner/rules/exfiltration.js +48 -0
- package/dist/scanner/rules/exfiltration.js.map +1 -0
- package/dist/scanner/rules/index.d.ts +18 -0
- package/dist/scanner/rules/index.d.ts.map +1 -0
- package/dist/scanner/rules/index.js +54 -0
- package/dist/scanner/rules/index.js.map +1 -0
- package/dist/scanner/rules/obfuscation.d.ts +6 -0
- package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
- package/dist/scanner/rules/obfuscation.js +37 -0
- package/dist/scanner/rules/obfuscation.js.map +1 -0
- package/dist/scanner/rules/prompt-injection.d.ts +6 -0
- package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
- package/dist/scanner/rules/prompt-injection.js +38 -0
- package/dist/scanner/rules/prompt-injection.js.map +1 -0
- package/dist/scanner/rules/remote-loader.d.ts +6 -0
- package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
- package/dist/scanner/rules/remote-loader.js +31 -0
- package/dist/scanner/rules/remote-loader.js.map +1 -0
- package/dist/scanner/rules/secrets.d.ts +6 -0
- package/dist/scanner/rules/secrets.d.ts.map +1 -0
- package/dist/scanner/rules/secrets.js +68 -0
- package/dist/scanner/rules/secrets.js.map +1 -0
- package/dist/scanner/rules/shell-exec.d.ts +6 -0
- package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
- package/dist/scanner/rules/shell-exec.js +52 -0
- package/dist/scanner/rules/shell-exec.js.map +1 -0
- package/dist/scanner/rules/web3.d.ts +6 -0
- package/dist/scanner/rules/web3.d.ts.map +1 -0
- package/dist/scanner/rules/web3.js +139 -0
- package/dist/scanner/rules/web3.js.map +1 -0
- package/dist/tests/action.test.d.ts +2 -0
- package/dist/tests/action.test.d.ts.map +1 -0
- package/dist/tests/action.test.js +127 -0
- package/dist/tests/action.test.js.map +1 -0
- package/dist/tests/registry.test.d.ts +2 -0
- package/dist/tests/registry.test.d.ts.map +1 -0
- package/dist/tests/registry.test.js +109 -0
- package/dist/tests/registry.test.js.map +1 -0
- package/dist/tests/scanner.test.d.ts +2 -0
- package/dist/tests/scanner.test.d.ts.map +1 -0
- package/dist/tests/scanner.test.js +57 -0
- package/dist/tests/scanner.test.js.map +1 -0
- package/dist/types/action.d.ts +198 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +3 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +104 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +21 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/scanner.d.ts +88 -0
- package/dist/types/scanner.d.ts.map +1 -0
- package/dist/types/scanner.js +20 -0
- package/dist/types/scanner.js.map +1 -0
- package/dist/types/skill.d.ts +52 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +33 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/utils/hash.d.ts +21 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +112 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/patterns.d.ts +74 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +157 -0
- package/dist/utils/patterns.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeNetworkRequest = analyzeNetworkRequest;
|
|
4
|
+
const patterns_js_1 = require("../../utils/patterns.js");
|
|
5
|
+
const secret_leak_js_1 = require("./secret-leak.js");
|
|
6
|
+
/**
|
|
7
|
+
* Known webhook/exfiltration domains
|
|
8
|
+
*/
|
|
9
|
+
const WEBHOOK_DOMAINS = [
|
|
10
|
+
'discord.com',
|
|
11
|
+
'discordapp.com',
|
|
12
|
+
'api.telegram.org',
|
|
13
|
+
'hooks.slack.com',
|
|
14
|
+
'webhook.site',
|
|
15
|
+
'requestbin.com',
|
|
16
|
+
'pipedream.com',
|
|
17
|
+
'ngrok.io',
|
|
18
|
+
'ngrok-free.app',
|
|
19
|
+
'beeceptor.com',
|
|
20
|
+
'mockbin.org',
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* Known malicious TLDs (high risk)
|
|
24
|
+
*/
|
|
25
|
+
const HIGH_RISK_TLDS = [
|
|
26
|
+
'.xyz',
|
|
27
|
+
'.top',
|
|
28
|
+
'.tk',
|
|
29
|
+
'.ml',
|
|
30
|
+
'.ga',
|
|
31
|
+
'.cf',
|
|
32
|
+
'.gq',
|
|
33
|
+
'.work',
|
|
34
|
+
'.click',
|
|
35
|
+
'.link',
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Analyze a network request for security risks
|
|
39
|
+
*/
|
|
40
|
+
function analyzeNetworkRequest(request, allowlist = []) {
|
|
41
|
+
const riskTags = [];
|
|
42
|
+
const evidence = [];
|
|
43
|
+
let riskLevel = 'low';
|
|
44
|
+
let shouldBlock = false;
|
|
45
|
+
let blockReason;
|
|
46
|
+
// Extract domain
|
|
47
|
+
const domain = (0, patterns_js_1.extractDomain)(request.url);
|
|
48
|
+
if (!domain) {
|
|
49
|
+
return {
|
|
50
|
+
risk_level: 'high',
|
|
51
|
+
risk_tags: ['INVALID_URL'],
|
|
52
|
+
evidence: [
|
|
53
|
+
{
|
|
54
|
+
type: 'invalid_url',
|
|
55
|
+
field: 'url',
|
|
56
|
+
match: request.url,
|
|
57
|
+
description: 'Could not parse URL',
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
should_block: true,
|
|
61
|
+
block_reason: 'Invalid URL',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Check if domain is in allowlist
|
|
65
|
+
const isAllowed = (0, patterns_js_1.isDomainAllowed)(domain, allowlist);
|
|
66
|
+
// Check for webhook domains
|
|
67
|
+
const isWebhook = WEBHOOK_DOMAINS.some((d) => domain === d || domain.endsWith('.' + d));
|
|
68
|
+
if (isWebhook) {
|
|
69
|
+
riskTags.push('WEBHOOK_EXFIL');
|
|
70
|
+
evidence.push({
|
|
71
|
+
type: 'webhook_domain',
|
|
72
|
+
field: 'url',
|
|
73
|
+
match: domain,
|
|
74
|
+
description: `Webhook/exfiltration domain detected: ${domain}`,
|
|
75
|
+
});
|
|
76
|
+
riskLevel = 'high';
|
|
77
|
+
if (!isAllowed) {
|
|
78
|
+
shouldBlock = true;
|
|
79
|
+
blockReason = 'Webhook domain not in allowlist';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Check for high-risk TLDs
|
|
83
|
+
const hasHighRiskTLD = HIGH_RISK_TLDS.some((tld) => domain.endsWith(tld));
|
|
84
|
+
if (hasHighRiskTLD && !isAllowed) {
|
|
85
|
+
riskTags.push('HIGH_RISK_TLD');
|
|
86
|
+
evidence.push({
|
|
87
|
+
type: 'high_risk_tld',
|
|
88
|
+
field: 'url',
|
|
89
|
+
match: domain,
|
|
90
|
+
description: `High-risk TLD detected`,
|
|
91
|
+
});
|
|
92
|
+
if (riskLevel === 'low')
|
|
93
|
+
riskLevel = 'medium';
|
|
94
|
+
}
|
|
95
|
+
// Check for untrusted domain
|
|
96
|
+
if (!isAllowed && !isWebhook) {
|
|
97
|
+
riskTags.push('UNTRUSTED_DOMAIN');
|
|
98
|
+
evidence.push({
|
|
99
|
+
type: 'untrusted_domain',
|
|
100
|
+
field: 'url',
|
|
101
|
+
match: domain,
|
|
102
|
+
description: `Domain not in allowlist`,
|
|
103
|
+
});
|
|
104
|
+
if (riskLevel === 'low')
|
|
105
|
+
riskLevel = 'medium';
|
|
106
|
+
}
|
|
107
|
+
// Check request body for sensitive data
|
|
108
|
+
if (request.body_preview) {
|
|
109
|
+
// Check for critical secrets (private keys, mnemonics)
|
|
110
|
+
if ((0, secret_leak_js_1.containsCriticalSecrets)(request.body_preview)) {
|
|
111
|
+
riskTags.push('CRITICAL_SECRET_EXFIL');
|
|
112
|
+
evidence.push({
|
|
113
|
+
type: 'critical_secret',
|
|
114
|
+
field: 'body',
|
|
115
|
+
description: 'Request body contains private key or mnemonic',
|
|
116
|
+
});
|
|
117
|
+
riskLevel = 'critical';
|
|
118
|
+
shouldBlock = true;
|
|
119
|
+
blockReason = 'Attempt to exfiltrate private key or mnemonic';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Check for other sensitive data
|
|
123
|
+
const secretLeak = (0, secret_leak_js_1.detectSecretLeak)(request.body_preview);
|
|
124
|
+
if (secretLeak.found) {
|
|
125
|
+
riskTags.push('POTENTIAL_SECRET_EXFIL');
|
|
126
|
+
evidence.push(...secretLeak.evidence);
|
|
127
|
+
if (secretLeak.risk_level === 'critical') {
|
|
128
|
+
riskLevel = 'critical';
|
|
129
|
+
shouldBlock = true;
|
|
130
|
+
blockReason = `Attempt to exfiltrate: ${secretLeak.secret_types.join(', ')}`;
|
|
131
|
+
}
|
|
132
|
+
else if (secretLeak.risk_level === 'high') {
|
|
133
|
+
riskLevel = 'high';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// POST/PUT to untrusted domain is higher risk
|
|
139
|
+
if ((request.method === 'POST' || request.method === 'PUT') &&
|
|
140
|
+
!isAllowed &&
|
|
141
|
+
riskLevel === 'medium') {
|
|
142
|
+
riskLevel = 'high';
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
risk_level: riskLevel,
|
|
146
|
+
risk_tags: riskTags,
|
|
147
|
+
evidence,
|
|
148
|
+
should_block: shouldBlock,
|
|
149
|
+
block_reason: blockReason,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/action/detectors/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ActionEvidence } from '../../types/action.js';
|
|
2
|
+
/**
|
|
3
|
+
* Secret leak detection result
|
|
4
|
+
*/
|
|
5
|
+
export interface SecretLeakResult {
|
|
6
|
+
/** Whether sensitive data was found */
|
|
7
|
+
found: boolean;
|
|
8
|
+
/** Risk level */
|
|
9
|
+
risk_level: 'low' | 'medium' | 'high' | 'critical';
|
|
10
|
+
/** Types of secrets found */
|
|
11
|
+
secret_types: string[];
|
|
12
|
+
/** Evidence */
|
|
13
|
+
evidence: ActionEvidence[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect sensitive data in content
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectSecretLeak(content: string): SecretLeakResult;
|
|
19
|
+
/**
|
|
20
|
+
* Check if content contains private keys or mnemonics
|
|
21
|
+
* These are always critical and should be blocked
|
|
22
|
+
*/
|
|
23
|
+
export declare function containsCriticalSecrets(content: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Get human-readable description of secret type
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSecretTypeDescription(type: string): string;
|
|
28
|
+
//# sourceMappingURL=secret-leak.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-leak.d.ts","sourceRoot":"","sources":["../../../src/action/detectors/secret-leak.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB;IACjB,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACnD,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe;IACf,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAkBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA0ClE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUhE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe7D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectSecretLeak = detectSecretLeak;
|
|
4
|
+
exports.containsCriticalSecrets = containsCriticalSecrets;
|
|
5
|
+
exports.getSecretTypeDescription = getSecretTypeDescription;
|
|
6
|
+
const patterns_js_1 = require("../../utils/patterns.js");
|
|
7
|
+
/**
|
|
8
|
+
* Priority of secret types (higher = more critical)
|
|
9
|
+
*/
|
|
10
|
+
const SECRET_PRIORITY = {
|
|
11
|
+
PRIVATE_KEY: 100,
|
|
12
|
+
MNEMONIC: 100,
|
|
13
|
+
SSH_KEY: 90,
|
|
14
|
+
AWS_SECRET: 80,
|
|
15
|
+
AWS_KEY: 70,
|
|
16
|
+
GITHUB_TOKEN: 70,
|
|
17
|
+
BEARER_TOKEN: 60,
|
|
18
|
+
API_SECRET: 50,
|
|
19
|
+
DB_CONNECTION: 50,
|
|
20
|
+
PASSWORD_CONFIG: 40,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Detect sensitive data in content
|
|
24
|
+
*/
|
|
25
|
+
function detectSecretLeak(content) {
|
|
26
|
+
const detection = (0, patterns_js_1.containsSensitiveData)(content);
|
|
27
|
+
if (!detection.found) {
|
|
28
|
+
return {
|
|
29
|
+
found: false,
|
|
30
|
+
risk_level: 'low',
|
|
31
|
+
secret_types: [],
|
|
32
|
+
evidence: [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Determine risk level based on secret types
|
|
36
|
+
const maxPriority = Math.max(...detection.types.map((t) => SECRET_PRIORITY[t] || 0));
|
|
37
|
+
let riskLevel;
|
|
38
|
+
if (maxPriority >= 90) {
|
|
39
|
+
riskLevel = 'critical';
|
|
40
|
+
}
|
|
41
|
+
else if (maxPriority >= 70) {
|
|
42
|
+
riskLevel = 'high';
|
|
43
|
+
}
|
|
44
|
+
else if (maxPriority >= 50) {
|
|
45
|
+
riskLevel = 'medium';
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
riskLevel = 'low';
|
|
49
|
+
}
|
|
50
|
+
// Build evidence
|
|
51
|
+
const evidence = detection.matches.map((m) => ({
|
|
52
|
+
type: 'secret_leak',
|
|
53
|
+
field: 'content',
|
|
54
|
+
match: m.truncated,
|
|
55
|
+
description: `Found ${m.type} pattern`,
|
|
56
|
+
}));
|
|
57
|
+
return {
|
|
58
|
+
found: true,
|
|
59
|
+
risk_level: riskLevel,
|
|
60
|
+
secret_types: detection.types,
|
|
61
|
+
evidence,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if content contains private keys or mnemonics
|
|
66
|
+
* These are always critical and should be blocked
|
|
67
|
+
*/
|
|
68
|
+
function containsCriticalSecrets(content) {
|
|
69
|
+
patterns_js_1.SENSITIVE_PATTERNS.PRIVATE_KEY.lastIndex = 0;
|
|
70
|
+
patterns_js_1.SENSITIVE_PATTERNS.MNEMONIC.lastIndex = 0;
|
|
71
|
+
patterns_js_1.SENSITIVE_PATTERNS.SSH_KEY.lastIndex = 0;
|
|
72
|
+
return (patterns_js_1.SENSITIVE_PATTERNS.PRIVATE_KEY.test(content) ||
|
|
73
|
+
patterns_js_1.SENSITIVE_PATTERNS.MNEMONIC.test(content) ||
|
|
74
|
+
patterns_js_1.SENSITIVE_PATTERNS.SSH_KEY.test(content));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get human-readable description of secret type
|
|
78
|
+
*/
|
|
79
|
+
function getSecretTypeDescription(type) {
|
|
80
|
+
const descriptions = {
|
|
81
|
+
PRIVATE_KEY: 'Ethereum private key',
|
|
82
|
+
MNEMONIC: 'Wallet seed phrase / mnemonic',
|
|
83
|
+
SSH_KEY: 'SSH private key',
|
|
84
|
+
AWS_KEY: 'AWS access key ID',
|
|
85
|
+
AWS_SECRET: 'AWS secret access key',
|
|
86
|
+
GITHUB_TOKEN: 'GitHub personal access token',
|
|
87
|
+
BEARER_TOKEN: 'Bearer/JWT token',
|
|
88
|
+
API_SECRET: 'API secret key',
|
|
89
|
+
DB_CONNECTION: 'Database connection string',
|
|
90
|
+
PASSWORD_CONFIG: 'Password in configuration',
|
|
91
|
+
};
|
|
92
|
+
return descriptions[type] || type;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=secret-leak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-leak.js","sourceRoot":"","sources":["../../../src/action/detectors/secret-leak.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token security result
|
|
3
|
+
*/
|
|
4
|
+
export interface TokenSecurityResult {
|
|
5
|
+
is_honeypot: boolean;
|
|
6
|
+
is_open_source: boolean;
|
|
7
|
+
is_proxy: boolean;
|
|
8
|
+
is_mintable: boolean;
|
|
9
|
+
can_take_back_ownership: boolean;
|
|
10
|
+
owner_change_balance: boolean;
|
|
11
|
+
hidden_owner: boolean;
|
|
12
|
+
selfdestruct: boolean;
|
|
13
|
+
external_call: boolean;
|
|
14
|
+
buy_tax: string;
|
|
15
|
+
sell_tax: string;
|
|
16
|
+
holder_count: string;
|
|
17
|
+
total_supply: string;
|
|
18
|
+
lp_holder_count: string;
|
|
19
|
+
is_true_token: boolean;
|
|
20
|
+
is_airdrop_scam: boolean;
|
|
21
|
+
trust_list: boolean;
|
|
22
|
+
other_potential_risks: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Address security result
|
|
26
|
+
*/
|
|
27
|
+
export interface AddressSecurityResult {
|
|
28
|
+
is_contract: boolean;
|
|
29
|
+
is_open_source: boolean;
|
|
30
|
+
is_proxy: boolean;
|
|
31
|
+
is_blacklisted: boolean;
|
|
32
|
+
is_whitelisted: boolean;
|
|
33
|
+
is_honeypot_related_address: boolean;
|
|
34
|
+
is_phishing_activities: boolean;
|
|
35
|
+
is_stealing_attack: boolean;
|
|
36
|
+
is_fake_token: boolean;
|
|
37
|
+
is_airdrop_scam: boolean;
|
|
38
|
+
is_malicious_mining_activities: boolean;
|
|
39
|
+
is_darkweb_transactions: boolean;
|
|
40
|
+
is_cybercrime: boolean;
|
|
41
|
+
is_money_laundering: boolean;
|
|
42
|
+
is_financial_crime: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Approval security result
|
|
46
|
+
*/
|
|
47
|
+
export interface ApprovalSecurityResult {
|
|
48
|
+
token_address: string;
|
|
49
|
+
token_name: string;
|
|
50
|
+
token_symbol: string;
|
|
51
|
+
is_open_source: boolean;
|
|
52
|
+
is_verified: boolean;
|
|
53
|
+
is_honeypot: boolean;
|
|
54
|
+
spender_address: string;
|
|
55
|
+
spender_tag: string;
|
|
56
|
+
is_contract: boolean;
|
|
57
|
+
doubt_list: boolean;
|
|
58
|
+
approved_amount: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Transaction simulation request
|
|
62
|
+
*/
|
|
63
|
+
export interface TxSimulationRequest {
|
|
64
|
+
chain_id: string;
|
|
65
|
+
from: string;
|
|
66
|
+
to: string;
|
|
67
|
+
value: string;
|
|
68
|
+
data?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Balance change from simulation
|
|
72
|
+
*/
|
|
73
|
+
export interface BalanceChange {
|
|
74
|
+
address: string;
|
|
75
|
+
amount: string;
|
|
76
|
+
token_address?: string;
|
|
77
|
+
token_symbol?: string;
|
|
78
|
+
direction: 'in' | 'out';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Approval change from simulation
|
|
82
|
+
*/
|
|
83
|
+
export interface ApprovalChangeResult {
|
|
84
|
+
token_address: string;
|
|
85
|
+
token_symbol?: string;
|
|
86
|
+
spender: string;
|
|
87
|
+
amount: string;
|
|
88
|
+
is_unlimited: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Transaction simulation result
|
|
92
|
+
*/
|
|
93
|
+
export interface TxSimulationResult {
|
|
94
|
+
success: boolean;
|
|
95
|
+
error_message?: string;
|
|
96
|
+
balance_changes: BalanceChange[];
|
|
97
|
+
approval_changes: ApprovalChangeResult[];
|
|
98
|
+
risk_level: 'low' | 'medium' | 'high' | 'critical';
|
|
99
|
+
risk_tags: string[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Phishing site result
|
|
103
|
+
*/
|
|
104
|
+
export interface PhishingSiteResult {
|
|
105
|
+
is_phishing: boolean;
|
|
106
|
+
phishing_site: boolean;
|
|
107
|
+
website_contract_security: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* GoPlus API client
|
|
111
|
+
*/
|
|
112
|
+
export declare class GoPlusClient {
|
|
113
|
+
private client;
|
|
114
|
+
private accessToken;
|
|
115
|
+
private tokenExpiresAt;
|
|
116
|
+
constructor();
|
|
117
|
+
/**
|
|
118
|
+
* Get access token from environment
|
|
119
|
+
*/
|
|
120
|
+
private getAccessToken;
|
|
121
|
+
/**
|
|
122
|
+
* Make authenticated request
|
|
123
|
+
*/
|
|
124
|
+
private request;
|
|
125
|
+
/**
|
|
126
|
+
* Check token security
|
|
127
|
+
*/
|
|
128
|
+
tokenSecurity(chainId: string, contractAddresses: string[]): Promise<Record<string, TokenSecurityResult>>;
|
|
129
|
+
/**
|
|
130
|
+
* Check address security (malicious address)
|
|
131
|
+
*/
|
|
132
|
+
addressSecurity(chainId: string, addresses: string[]): Promise<Record<string, AddressSecurityResult>>;
|
|
133
|
+
/**
|
|
134
|
+
* Check approval security
|
|
135
|
+
*/
|
|
136
|
+
approvalSecurity(chainId: string, contractAddresses: string[]): Promise<ApprovalSecurityResult[]>;
|
|
137
|
+
/**
|
|
138
|
+
* Check phishing site
|
|
139
|
+
*/
|
|
140
|
+
phishingSite(url: string): Promise<PhishingSiteResult>;
|
|
141
|
+
/**
|
|
142
|
+
* Simulate transaction
|
|
143
|
+
*/
|
|
144
|
+
simulateTransaction(request: TxSimulationRequest): Promise<TxSimulationResult>;
|
|
145
|
+
/**
|
|
146
|
+
* Check if GoPlus credentials are configured
|
|
147
|
+
*/
|
|
148
|
+
static isConfigured(): boolean;
|
|
149
|
+
}
|
|
150
|
+
export declare const goplusClient: GoPlusClient;
|
|
151
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/action/goplus/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.goplusClient = exports.GoPlusClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
/**
|
|
9
|
+
* GoPlus API base URL
|
|
10
|
+
*/
|
|
11
|
+
const API_BASE_URL = 'https://api.gopluslabs.io/api/v1';
|
|
12
|
+
/**
|
|
13
|
+
* GoPlus API client
|
|
14
|
+
*/
|
|
15
|
+
class GoPlusClient {
|
|
16
|
+
client;
|
|
17
|
+
accessToken = null;
|
|
18
|
+
tokenExpiresAt = 0;
|
|
19
|
+
constructor() {
|
|
20
|
+
this.client = axios_1.default.create({
|
|
21
|
+
baseURL: API_BASE_URL,
|
|
22
|
+
timeout: 30000,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get access token from environment
|
|
27
|
+
*/
|
|
28
|
+
async getAccessToken() {
|
|
29
|
+
// Check if token is still valid
|
|
30
|
+
if (this.accessToken && Date.now() < this.tokenExpiresAt) {
|
|
31
|
+
return this.accessToken;
|
|
32
|
+
}
|
|
33
|
+
const apiKey = process.env.GOPLUS_API_KEY;
|
|
34
|
+
const apiSecret = process.env.GOPLUS_API_SECRET;
|
|
35
|
+
if (!apiKey || !apiSecret) {
|
|
36
|
+
throw new Error('GoPlus API credentials not found. Set GOPLUS_API_KEY and GOPLUS_API_SECRET environment variables.');
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const response = await this.client.post('/token', {
|
|
40
|
+
app_key: apiKey,
|
|
41
|
+
app_secret: apiSecret,
|
|
42
|
+
});
|
|
43
|
+
if (response.data.code === 1 && response.data.result?.access_token) {
|
|
44
|
+
this.accessToken = response.data.result.access_token;
|
|
45
|
+
// Token expires in 2 hours, refresh 5 minutes before
|
|
46
|
+
this.tokenExpiresAt = Date.now() + 115 * 60 * 1000;
|
|
47
|
+
return this.accessToken;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(response.data.message || 'Failed to get access token');
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
53
|
+
throw new Error(`GoPlus auth failed: ${error.message}`);
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Make authenticated request
|
|
60
|
+
*/
|
|
61
|
+
async request(method, path, params, data) {
|
|
62
|
+
const token = await this.getAccessToken();
|
|
63
|
+
const config = {
|
|
64
|
+
headers: {
|
|
65
|
+
Authorization: `Bearer ${token}`,
|
|
66
|
+
},
|
|
67
|
+
params,
|
|
68
|
+
};
|
|
69
|
+
const response = method === 'get'
|
|
70
|
+
? await this.client.get(path, config)
|
|
71
|
+
: await this.client.post(path, data, config);
|
|
72
|
+
if (response.data.code !== 1) {
|
|
73
|
+
throw new Error(response.data.message || 'GoPlus API error');
|
|
74
|
+
}
|
|
75
|
+
return response.data.result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check token security
|
|
79
|
+
*/
|
|
80
|
+
async tokenSecurity(chainId, contractAddresses) {
|
|
81
|
+
return this.request('get', `/token_security/${chainId}`, { contract_addresses: contractAddresses.join(',') });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check address security (malicious address)
|
|
85
|
+
*/
|
|
86
|
+
async addressSecurity(chainId, addresses) {
|
|
87
|
+
return this.request('get', `/address_security/${addresses.join(',')}`, { chain_id: chainId });
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check approval security
|
|
91
|
+
*/
|
|
92
|
+
async approvalSecurity(chainId, contractAddresses) {
|
|
93
|
+
return this.request('get', `/approval_security/${chainId}`, { contract_addresses: contractAddresses.join(',') });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check phishing site
|
|
97
|
+
*/
|
|
98
|
+
async phishingSite(url) {
|
|
99
|
+
const result = await this.request('get', '/phishing_site', { url });
|
|
100
|
+
return result[url] || { is_phishing: false, phishing_site: false, website_contract_security: false };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Simulate transaction
|
|
104
|
+
*/
|
|
105
|
+
async simulateTransaction(request) {
|
|
106
|
+
try {
|
|
107
|
+
const result = await this.request('post', '/transaction_security', undefined, request);
|
|
108
|
+
// Parse and normalize the result
|
|
109
|
+
const balanceChanges = [];
|
|
110
|
+
const approvalChanges = [];
|
|
111
|
+
const riskTags = [];
|
|
112
|
+
// Extract balance changes
|
|
113
|
+
if (result.balance_change) {
|
|
114
|
+
for (const change of result.balance_change) {
|
|
115
|
+
balanceChanges.push({
|
|
116
|
+
address: change.address || request.from,
|
|
117
|
+
amount: change.amount || '0',
|
|
118
|
+
token_address: change.token_address,
|
|
119
|
+
token_symbol: change.token_symbol,
|
|
120
|
+
direction: parseFloat(change.amount || '0') < 0 ? 'out' : 'in',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Extract approval changes
|
|
125
|
+
if (result.approval_change) {
|
|
126
|
+
for (const change of result.approval_change) {
|
|
127
|
+
const isUnlimited = change.amount === 'unlimited' ||
|
|
128
|
+
change.amount === 'max' ||
|
|
129
|
+
parseFloat(change.amount || '0') > 1e18;
|
|
130
|
+
approvalChanges.push({
|
|
131
|
+
token_address: change.token_address,
|
|
132
|
+
token_symbol: change.token_symbol,
|
|
133
|
+
spender: change.spender,
|
|
134
|
+
amount: change.amount || '0',
|
|
135
|
+
is_unlimited: isUnlimited,
|
|
136
|
+
});
|
|
137
|
+
if (isUnlimited) {
|
|
138
|
+
riskTags.push('UNLIMITED_APPROVAL');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Extract risk tags
|
|
143
|
+
if (result.risk_type && Array.isArray(result.risk_type)) {
|
|
144
|
+
riskTags.push(...result.risk_type);
|
|
145
|
+
}
|
|
146
|
+
// Determine risk level
|
|
147
|
+
let riskLevel = 'low';
|
|
148
|
+
if (riskTags.includes('UNLIMITED_APPROVAL') ||
|
|
149
|
+
riskTags.includes('malicious_address') ||
|
|
150
|
+
riskTags.includes('phishing')) {
|
|
151
|
+
riskLevel = 'high';
|
|
152
|
+
}
|
|
153
|
+
else if (riskTags.length > 0) {
|
|
154
|
+
riskLevel = 'medium';
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
success: result.simulation_success !== false,
|
|
158
|
+
error_message: result.error_message,
|
|
159
|
+
balance_changes: balanceChanges,
|
|
160
|
+
approval_changes: approvalChanges,
|
|
161
|
+
risk_level: riskLevel,
|
|
162
|
+
risk_tags: riskTags,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
// Return error result
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error_message: error instanceof Error ? error.message : 'Simulation failed',
|
|
170
|
+
balance_changes: [],
|
|
171
|
+
approval_changes: [],
|
|
172
|
+
risk_level: 'high',
|
|
173
|
+
risk_tags: ['SIMULATION_FAILED'],
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if GoPlus credentials are configured
|
|
179
|
+
*/
|
|
180
|
+
static isConfigured() {
|
|
181
|
+
return !!(process.env.GOPLUS_API_KEY && process.env.GOPLUS_API_SECRET);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.GoPlusClient = GoPlusClient;
|
|
185
|
+
// Export singleton instance
|
|
186
|
+
exports.goplusClient = new GoPlusClient();
|
|
187
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/action/goplus/client.ts"],"names":[],"mappings":"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"}
|