@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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/action/detectors/exec.d.ts +21 -0
  4. package/dist/action/detectors/exec.d.ts.map +1 -0
  5. package/dist/action/detectors/exec.js +201 -0
  6. package/dist/action/detectors/exec.js.map +1 -0
  7. package/dist/action/detectors/index.d.ts +4 -0
  8. package/dist/action/detectors/index.d.ts.map +1 -0
  9. package/dist/action/detectors/index.js +20 -0
  10. package/dist/action/detectors/index.js.map +1 -0
  11. package/dist/action/detectors/network.d.ts +21 -0
  12. package/dist/action/detectors/network.d.ts.map +1 -0
  13. package/dist/action/detectors/network.js +152 -0
  14. package/dist/action/detectors/network.js.map +1 -0
  15. package/dist/action/detectors/secret-leak.d.ts +28 -0
  16. package/dist/action/detectors/secret-leak.d.ts.map +1 -0
  17. package/dist/action/detectors/secret-leak.js +94 -0
  18. package/dist/action/detectors/secret-leak.js.map +1 -0
  19. package/dist/action/goplus/client.d.ts +151 -0
  20. package/dist/action/goplus/client.d.ts.map +1 -0
  21. package/dist/action/goplus/client.js +187 -0
  22. package/dist/action/goplus/client.js.map +1 -0
  23. package/dist/action/index.d.ts +61 -0
  24. package/dist/action/index.d.ts.map +1 -0
  25. package/dist/action/index.js +643 -0
  26. package/dist/action/index.js.map +1 -0
  27. package/dist/index.d.ts +31 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +77 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mcp-server.d.ts +3 -0
  32. package/dist/mcp-server.d.ts.map +1 -0
  33. package/dist/mcp-server.js +410 -0
  34. package/dist/mcp-server.js.map +1 -0
  35. package/dist/policy/default.d.ts +77 -0
  36. package/dist/policy/default.d.ts.map +1 -0
  37. package/dist/policy/default.js +94 -0
  38. package/dist/policy/default.js.map +1 -0
  39. package/dist/registry/index.d.ts +93 -0
  40. package/dist/registry/index.d.ts.map +1 -0
  41. package/dist/registry/index.js +280 -0
  42. package/dist/registry/index.js.map +1 -0
  43. package/dist/registry/storage.d.ts +69 -0
  44. package/dist/registry/storage.d.ts.map +1 -0
  45. package/dist/registry/storage.js +208 -0
  46. package/dist/registry/storage.js.map +1 -0
  47. package/dist/registry/trust.d.ts +41 -0
  48. package/dist/registry/trust.d.ts.map +1 -0
  49. package/dist/registry/trust.js +139 -0
  50. package/dist/registry/trust.js.map +1 -0
  51. package/dist/scanner/file-walker.d.ts +34 -0
  52. package/dist/scanner/file-walker.d.ts.map +1 -0
  53. package/dist/scanner/file-walker.js +134 -0
  54. package/dist/scanner/file-walker.js.map +1 -0
  55. package/dist/scanner/index.d.ts +67 -0
  56. package/dist/scanner/index.d.ts.map +1 -0
  57. package/dist/scanner/index.js +349 -0
  58. package/dist/scanner/index.js.map +1 -0
  59. package/dist/scanner/rules/exfiltration.d.ts +6 -0
  60. package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
  61. package/dist/scanner/rules/exfiltration.js +48 -0
  62. package/dist/scanner/rules/exfiltration.js.map +1 -0
  63. package/dist/scanner/rules/index.d.ts +18 -0
  64. package/dist/scanner/rules/index.d.ts.map +1 -0
  65. package/dist/scanner/rules/index.js +54 -0
  66. package/dist/scanner/rules/index.js.map +1 -0
  67. package/dist/scanner/rules/obfuscation.d.ts +6 -0
  68. package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
  69. package/dist/scanner/rules/obfuscation.js +37 -0
  70. package/dist/scanner/rules/obfuscation.js.map +1 -0
  71. package/dist/scanner/rules/prompt-injection.d.ts +6 -0
  72. package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
  73. package/dist/scanner/rules/prompt-injection.js +38 -0
  74. package/dist/scanner/rules/prompt-injection.js.map +1 -0
  75. package/dist/scanner/rules/remote-loader.d.ts +6 -0
  76. package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
  77. package/dist/scanner/rules/remote-loader.js +31 -0
  78. package/dist/scanner/rules/remote-loader.js.map +1 -0
  79. package/dist/scanner/rules/secrets.d.ts +6 -0
  80. package/dist/scanner/rules/secrets.d.ts.map +1 -0
  81. package/dist/scanner/rules/secrets.js +68 -0
  82. package/dist/scanner/rules/secrets.js.map +1 -0
  83. package/dist/scanner/rules/shell-exec.d.ts +6 -0
  84. package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
  85. package/dist/scanner/rules/shell-exec.js +52 -0
  86. package/dist/scanner/rules/shell-exec.js.map +1 -0
  87. package/dist/scanner/rules/web3.d.ts +6 -0
  88. package/dist/scanner/rules/web3.d.ts.map +1 -0
  89. package/dist/scanner/rules/web3.js +139 -0
  90. package/dist/scanner/rules/web3.js.map +1 -0
  91. package/dist/tests/action.test.d.ts +2 -0
  92. package/dist/tests/action.test.d.ts.map +1 -0
  93. package/dist/tests/action.test.js +127 -0
  94. package/dist/tests/action.test.js.map +1 -0
  95. package/dist/tests/registry.test.d.ts +2 -0
  96. package/dist/tests/registry.test.d.ts.map +1 -0
  97. package/dist/tests/registry.test.js +109 -0
  98. package/dist/tests/registry.test.js.map +1 -0
  99. package/dist/tests/scanner.test.d.ts +2 -0
  100. package/dist/tests/scanner.test.d.ts.map +1 -0
  101. package/dist/tests/scanner.test.js +57 -0
  102. package/dist/tests/scanner.test.js.map +1 -0
  103. package/dist/types/action.d.ts +198 -0
  104. package/dist/types/action.d.ts.map +1 -0
  105. package/dist/types/action.js +3 -0
  106. package/dist/types/action.js.map +1 -0
  107. package/dist/types/index.d.ts +5 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +22 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/registry.d.ts +104 -0
  112. package/dist/types/registry.d.ts.map +1 -0
  113. package/dist/types/registry.js +21 -0
  114. package/dist/types/registry.js.map +1 -0
  115. package/dist/types/scanner.d.ts +88 -0
  116. package/dist/types/scanner.d.ts.map +1 -0
  117. package/dist/types/scanner.js +20 -0
  118. package/dist/types/scanner.js.map +1 -0
  119. package/dist/types/skill.d.ts +52 -0
  120. package/dist/types/skill.d.ts.map +1 -0
  121. package/dist/types/skill.js +33 -0
  122. package/dist/types/skill.js.map +1 -0
  123. package/dist/utils/hash.d.ts +21 -0
  124. package/dist/utils/hash.d.ts.map +1 -0
  125. package/dist/utils/hash.js +112 -0
  126. package/dist/utils/hash.js.map +1 -0
  127. package/dist/utils/patterns.d.ts +74 -0
  128. package/dist/utils/patterns.d.ts.map +1 -0
  129. package/dist/utils/patterns.js +157 -0
  130. package/dist/utils/patterns.js.map +1 -0
  131. 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":";;;;;;AAAA,kDAAkD;AAElD;;GAEG;AACH,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAsHxD;;GAEG;AACH,MAAa,YAAY;IACf,MAAM,CAAgB;IACtB,WAAW,GAAkB,IAAI,CAAC;IAClC,cAAc,GAAW,CAAC,CAAC;IAEnC;QACE,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,gCAAgC;QAChC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAEhD,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAChD,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;gBACnE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBACrD,qDAAqD;gBACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;gBACnD,OAAO,IAAI,CAAC,WAAY,CAAC;YAC3B,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CACnB,MAAsB,EACtB,IAAY,EACZ,MAA+B,EAC/B,IAAc;QAEd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,MAAM,MAAM,GAAG;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;YACD,MAAM;SACP,CAAC;QAEF,MAAM,QAAQ,GACZ,MAAM,KAAK,KAAK;YACd,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;YACrC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,iBAA2B;QAE3B,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,mBAAmB,OAAO,EAAE,EAC5B,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,SAAmB;QAEnB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,qBAAqB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC1C,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,iBAA2B;QAE3B,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,sBAAsB,OAAO,EAAE,EAC/B,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,gBAAgB,EAChB,EAAE,GAAG,EAAE,CACR,CAAC;QACF,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC;IACvG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,OAA4B;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,MAAM,EACN,uBAAuB,EACvB,SAAS,EACT,OAAO,CACR,CAAC;YAEF,iCAAiC;YACjC,MAAM,cAAc,GAAoB,EAAE,CAAC;YAC3C,MAAM,eAAe,GAA2B,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAE9B,0BAA0B;YAC1B,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;oBAC3C,cAAc,CAAC,IAAI,CAAC;wBAClB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI;wBACvC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG;wBAC5B,aAAa,EAAE,MAAM,CAAC,aAAa;wBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;qBAC/D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC5C,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,WAAW;wBAC7B,MAAM,CAAC,MAAM,KAAK,KAAK;wBACvB,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;oBAE1C,eAAe,CAAC,IAAI,CAAC;wBACnB,aAAa,EAAE,MAAM,CAAC,aAAa;wBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG;wBAC5B,YAAY,EAAE,WAAW;qBAC1B,CAAC,CAAC;oBAEH,IAAI,WAAW,EAAE,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YAED,uBAAuB;YACvB,IAAI,SAAS,GAA2C,KAAK,CAAC;YAE9D,IACE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;gBACvC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACtC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC7B,CAAC;gBACD,SAAS,GAAG,MAAM,CAAC;YACrB,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,SAAS,GAAG,QAAQ,CAAC;YACvB,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,kBAAkB,KAAK,KAAK;gBAC5C,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,eAAe,EAAE,cAAc;gBAC/B,gBAAgB,EAAE,eAAe;gBACjC,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sBAAsB;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;gBAC9D,eAAe,EAAE,EAAE;gBACnB,gBAAgB,EAAE,EAAE;gBACpB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,CAAC,mBAAmB,CAAC;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzE,CAAC;CACF;AA5OD,oCA4OC;AAED,4BAA4B;AACf,QAAA,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}