@rlajous/sdk-threat 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 (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +288 -0
  3. package/dist/cjs/client.js +165 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/index.js +33 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/cjs/resources/account-trace.js +96 -0
  9. package/dist/cjs/resources/account-trace.js.map +1 -0
  10. package/dist/cjs/resources/addresses.js +189 -0
  11. package/dist/cjs/resources/addresses.js.map +1 -0
  12. package/dist/cjs/resources/contracts.js +216 -0
  13. package/dist/cjs/resources/contracts.js.map +1 -0
  14. package/dist/cjs/resources/index.js +18 -0
  15. package/dist/cjs/resources/index.js.map +1 -0
  16. package/dist/cjs/resources/ledger.js +123 -0
  17. package/dist/cjs/resources/ledger.js.map +1 -0
  18. package/dist/cjs/resources/url.js +85 -0
  19. package/dist/cjs/resources/url.js.map +1 -0
  20. package/dist/cjs/resources/usage.js +124 -0
  21. package/dist/cjs/resources/usage.js.map +1 -0
  22. package/dist/cjs/resources/wallets.js +149 -0
  23. package/dist/cjs/resources/wallets.js.map +1 -0
  24. package/dist/cjs/types/account-trace.js +3 -0
  25. package/dist/cjs/types/account-trace.js.map +1 -0
  26. package/dist/cjs/types/address.js +3 -0
  27. package/dist/cjs/types/address.js.map +1 -0
  28. package/dist/cjs/types/contract.js +3 -0
  29. package/dist/cjs/types/contract.js.map +1 -0
  30. package/dist/cjs/types/index.js +3 -0
  31. package/dist/cjs/types/index.js.map +1 -0
  32. package/dist/cjs/types/ledger.js +3 -0
  33. package/dist/cjs/types/ledger.js.map +1 -0
  34. package/dist/cjs/types/url.js +3 -0
  35. package/dist/cjs/types/url.js.map +1 -0
  36. package/dist/cjs/types/usage.js +3 -0
  37. package/dist/cjs/types/usage.js.map +1 -0
  38. package/dist/cjs/types/wallet.js +3 -0
  39. package/dist/cjs/types/wallet.js.map +1 -0
  40. package/dist/esm/client.js +161 -0
  41. package/dist/esm/client.js.map +1 -0
  42. package/dist/esm/index.js +7 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/package.json +1 -0
  45. package/dist/esm/resources/account-trace.js +92 -0
  46. package/dist/esm/resources/account-trace.js.map +1 -0
  47. package/dist/esm/resources/addresses.js +185 -0
  48. package/dist/esm/resources/addresses.js.map +1 -0
  49. package/dist/esm/resources/contracts.js +212 -0
  50. package/dist/esm/resources/contracts.js.map +1 -0
  51. package/dist/esm/resources/index.js +8 -0
  52. package/dist/esm/resources/index.js.map +1 -0
  53. package/dist/esm/resources/ledger.js +119 -0
  54. package/dist/esm/resources/ledger.js.map +1 -0
  55. package/dist/esm/resources/url.js +81 -0
  56. package/dist/esm/resources/url.js.map +1 -0
  57. package/dist/esm/resources/usage.js +120 -0
  58. package/dist/esm/resources/usage.js.map +1 -0
  59. package/dist/esm/resources/wallets.js +145 -0
  60. package/dist/esm/resources/wallets.js.map +1 -0
  61. package/dist/esm/types/account-trace.js +2 -0
  62. package/dist/esm/types/account-trace.js.map +1 -0
  63. package/dist/esm/types/address.js +2 -0
  64. package/dist/esm/types/address.js.map +1 -0
  65. package/dist/esm/types/contract.js +2 -0
  66. package/dist/esm/types/contract.js.map +1 -0
  67. package/dist/esm/types/index.js +2 -0
  68. package/dist/esm/types/index.js.map +1 -0
  69. package/dist/esm/types/ledger.js +2 -0
  70. package/dist/esm/types/ledger.js.map +1 -0
  71. package/dist/esm/types/url.js +2 -0
  72. package/dist/esm/types/url.js.map +1 -0
  73. package/dist/esm/types/usage.js +2 -0
  74. package/dist/esm/types/usage.js.map +1 -0
  75. package/dist/esm/types/wallet.js +2 -0
  76. package/dist/esm/types/wallet.js.map +1 -0
  77. package/dist/types/client.d.ts +145 -0
  78. package/dist/types/client.d.ts.map +1 -0
  79. package/dist/types/index.d.ts +5 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/resources/account-trace.d.ts +67 -0
  82. package/dist/types/resources/account-trace.d.ts.map +1 -0
  83. package/dist/types/resources/addresses.d.ts +131 -0
  84. package/dist/types/resources/addresses.d.ts.map +1 -0
  85. package/dist/types/resources/contracts.d.ts +156 -0
  86. package/dist/types/resources/contracts.d.ts.map +1 -0
  87. package/dist/types/resources/index.d.ts +8 -0
  88. package/dist/types/resources/index.d.ts.map +1 -0
  89. package/dist/types/resources/ledger.d.ts +107 -0
  90. package/dist/types/resources/ledger.d.ts.map +1 -0
  91. package/dist/types/resources/url.d.ts +69 -0
  92. package/dist/types/resources/url.d.ts.map +1 -0
  93. package/dist/types/resources/usage.d.ts +99 -0
  94. package/dist/types/resources/usage.d.ts.map +1 -0
  95. package/dist/types/resources/wallets.d.ts +106 -0
  96. package/dist/types/resources/wallets.d.ts.map +1 -0
  97. package/dist/types/types/account-trace.d.ts +68 -0
  98. package/dist/types/types/account-trace.d.ts.map +1 -0
  99. package/dist/types/types/address.d.ts +266 -0
  100. package/dist/types/types/address.d.ts.map +1 -0
  101. package/dist/types/types/contract.d.ts +169 -0
  102. package/dist/types/types/contract.d.ts.map +1 -0
  103. package/dist/types/types/index.d.ts +8 -0
  104. package/dist/types/types/index.d.ts.map +1 -0
  105. package/dist/types/types/ledger.d.ts +106 -0
  106. package/dist/types/types/ledger.d.ts.map +1 -0
  107. package/dist/types/types/url.d.ts +39 -0
  108. package/dist/types/types/url.d.ts.map +1 -0
  109. package/dist/types/types/usage.d.ts +74 -0
  110. package/dist/types/types/usage.d.ts.map +1 -0
  111. package/dist/types/types/wallet.d.ts +129 -0
  112. package/dist/types/types/wallet.d.ts.map +1 -0
  113. package/package.json +74 -0
@@ -0,0 +1,185 @@
1
+ import { ValidationError, isValidAddress, CHAIN_NAMES, } from '@rlajous/sdk-core';
2
+ /**
3
+ * Resource for address risk analysis
4
+ *
5
+ * Provides comprehensive security analysis for blockchain addresses including:
6
+ * - Overall risk scoring
7
+ * - Risk categorization and tagging
8
+ * - Sanctions screening
9
+ * - Address poisoning detection
10
+ * - Fund flow analysis
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Analyze an address
15
+ * const risk = await client.addresses.analyze('0x...', { chain: Chain.ETH });
16
+ *
17
+ * // Check sanctions
18
+ * const sanctioned = await client.addresses.checkSanctioned('0x...', { chain: Chain.ETH });
19
+ *
20
+ * // With default chain configured, chain can be omitted
21
+ * const client = new ThreatClient({ apiKey: '...', defaultChain: Chain.ETH });
22
+ * const risk = await client.addresses.analyze('0x...'); // Uses ETH
23
+ * ```
24
+ */
25
+ export class AddressesResource {
26
+ httpClient;
27
+ defaultChain;
28
+ constructor(httpClient, defaultChain) {
29
+ this.httpClient = httpClient;
30
+ this.defaultChain = defaultChain;
31
+ }
32
+ /**
33
+ * Resolve the chain to use for a request
34
+ * @throws ValidationError if no chain is specified and no default is set
35
+ */
36
+ resolveChain(options) {
37
+ const chain = options?.chain ?? this.defaultChain;
38
+ if (!chain) {
39
+ throw new ValidationError('Chain is required. Either specify chain in options or set defaultChain in client configuration.');
40
+ }
41
+ return chain;
42
+ }
43
+ /**
44
+ * Validate address format for the given chain
45
+ * @throws ValidationError if address format is invalid for the chain
46
+ */
47
+ validateAddress(address, chain) {
48
+ if (!isValidAddress(address, chain)) {
49
+ const chainName = CHAIN_NAMES[chain] || chain;
50
+ throw new ValidationError(`Invalid ${chainName} address: "${address}". Please provide a valid address format for the ${chainName} blockchain.`);
51
+ }
52
+ }
53
+ /**
54
+ * Analyze an address for security risks
55
+ *
56
+ * Returns comprehensive risk analysis including:
57
+ * - Overall risk score (0-100)
58
+ * - Risk tags and categories
59
+ * - Detailed analysis data (optional)
60
+ * - Deployer risk for contracts (optional)
61
+ *
62
+ * @param address - Address to analyze
63
+ * @param options - Analysis options (chain is optional if defaultChain is set)
64
+ * @returns Address risk analysis result
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * // Basic analysis
69
+ * const risk = await client.addresses.analyze('0x742d35Cc...', {
70
+ * chain: Chain.ETH,
71
+ * });
72
+ * console.log(`Risk score: ${risk.overallRisk}`);
73
+ *
74
+ * // With default chain, options can be omitted
75
+ * const risk = await client.addresses.analyze('0x742d35Cc...');
76
+ *
77
+ * // With specific modules
78
+ * const risk = await client.addresses.analyze('0x...', {
79
+ * chain: Chain.ETH,
80
+ * modules: [RiskModule.SANCTIONS_COMPLIANCE, RiskModule.FUND_FLOW_SCREENING],
81
+ * });
82
+ *
83
+ * // With detailed response and deployer risk
84
+ * const risk = await client.addresses.analyze('0x...', {
85
+ * chain: Chain.ETH,
86
+ * detailed: true,
87
+ * deployerRisk: true,
88
+ * });
89
+ * ```
90
+ */
91
+ async analyze(address, options = {}) {
92
+ const chain = this.resolveChain(options);
93
+ this.validateAddress(address, chain);
94
+ const queryParams = new URLSearchParams();
95
+ queryParams.append('chain', chain);
96
+ if (options.modules && options.modules.length > 0) {
97
+ for (const module of options.modules) {
98
+ queryParams.append('modules', module);
99
+ }
100
+ }
101
+ if (options.detailed !== undefined) {
102
+ queryParams.append('detailed', String(options.detailed));
103
+ }
104
+ if (options.deployerRisk !== undefined) {
105
+ queryParams.append('deployer_risk', String(options.deployerRisk));
106
+ }
107
+ const response = await this.httpClient.get(`/addresses/${encodeURIComponent(address)}?${queryParams.toString()}`, {
108
+ timeout: options.timeout,
109
+ signal: options.signal,
110
+ });
111
+ return response.data;
112
+ }
113
+ /**
114
+ * Check if an address is sanctioned
115
+ *
116
+ * Screens the address against known sanctions lists including OFAC.
117
+ *
118
+ * @param address - Address to check
119
+ * @param options - Request options (chain is optional if defaultChain is set)
120
+ * @returns Sanctions check result
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const result = await client.addresses.checkSanctioned('0x...', {
125
+ * chain: Chain.ETH,
126
+ * });
127
+ *
128
+ * // With default chain configured
129
+ * const result = await client.addresses.checkSanctioned('0x...');
130
+ *
131
+ * if (result.is_sanctioned) {
132
+ * console.error('Address is sanctioned!');
133
+ * console.log('Details:', result.sanction_details);
134
+ * }
135
+ * ```
136
+ */
137
+ async checkSanctioned(address, options = {}) {
138
+ const chain = this.resolveChain(options);
139
+ this.validateAddress(address, chain);
140
+ const queryParams = new URLSearchParams();
141
+ queryParams.append('chain', chain);
142
+ const response = await this.httpClient.get(`/addresses/sanctioned/${encodeURIComponent(address)}?${queryParams.toString()}`, {
143
+ timeout: options.timeout,
144
+ signal: options.signal,
145
+ });
146
+ return response.data;
147
+ }
148
+ /**
149
+ * Check for address poisoning attacks
150
+ *
151
+ * Detects if an address has been targeted by address poisoning
152
+ * (dust attack) attempts.
153
+ *
154
+ * @param address - Address to check
155
+ * @param options - Request options (chain is optional if defaultChain is set)
156
+ * @returns Poisoning detection result
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * const result = await client.addresses.checkPoisoning('0x...', {
161
+ * chain: Chain.ETH,
162
+ * });
163
+ *
164
+ * // With default chain configured
165
+ * const result = await client.addresses.checkPoisoning('0x...');
166
+ *
167
+ * if (result.is_poisoned) {
168
+ * console.warn('Address poisoning detected!');
169
+ * console.log('Similar addresses:', result.poisoning_details?.similar_addresses);
170
+ * }
171
+ * ```
172
+ */
173
+ async checkPoisoning(address, options = {}) {
174
+ const chain = this.resolveChain(options);
175
+ this.validateAddress(address, chain);
176
+ const queryParams = new URLSearchParams();
177
+ queryParams.append('chain', chain);
178
+ const response = await this.httpClient.get(`/addresses/${encodeURIComponent(address)}/poisoning?${queryParams.toString()}`, {
179
+ timeout: options.timeout,
180
+ signal: options.signal,
181
+ });
182
+ return response.data;
183
+ }
184
+ }
185
+ //# sourceMappingURL=addresses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/resources/addresses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { ValidationError, isValidAddress, CHAIN_NAMES, } from '@rlajous/sdk-core';
2
+ /**
3
+ * Resource for smart contract security analysis
4
+ *
5
+ * Provides comprehensive contract analysis including:
6
+ * - Static and dynamic code analysis
7
+ * - Vulnerability detection
8
+ * - Source code verification
9
+ * - Tax/fee detection
10
+ * - Deployer risk analysis
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Analyze a contract
15
+ * const risk = await client.contracts.analyze('0x...', { chain: Chain.ETH });
16
+ *
17
+ * // Get source code
18
+ * const source = await client.contracts.getSourceCode('0x...', { chain: Chain.ETH });
19
+ *
20
+ * // With default chain configured, chain can be omitted
21
+ * const client = new ThreatClient({ apiKey: '...', defaultChain: Chain.ETH });
22
+ * const risk = await client.contracts.analyze('0x...'); // Uses ETH
23
+ * ```
24
+ */
25
+ export class ContractsResource {
26
+ httpClient;
27
+ defaultChain;
28
+ constructor(httpClient, defaultChain) {
29
+ this.httpClient = httpClient;
30
+ this.defaultChain = defaultChain;
31
+ }
32
+ /**
33
+ * Resolve the chain to use for a request
34
+ * @throws ValidationError if no chain is specified and no default is set
35
+ */
36
+ resolveChain(options) {
37
+ const chain = options?.chain ?? this.defaultChain;
38
+ if (!chain) {
39
+ throw new ValidationError('Chain is required. Either specify chain in options or set defaultChain in client configuration.');
40
+ }
41
+ return chain;
42
+ }
43
+ /**
44
+ * Analyze a smart contract for security risks
45
+ *
46
+ * Returns comprehensive analysis including:
47
+ * - Risk score and categorization
48
+ * - Vulnerability detection
49
+ * - Source code analysis (if verified)
50
+ * - Similar contracts
51
+ * - Deployer risk (optional)
52
+ *
53
+ * @param address - Contract address
54
+ * @param options - Analysis options (chain is optional if defaultChain is set)
55
+ * @returns Contract risk analysis result
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const result = await client.contracts.analyze('0xContract...', {
60
+ * chain: Chain.ETH,
61
+ * });
62
+ *
63
+ * // With default chain, options can be omitted
64
+ * const result = await client.contracts.analyze('0xContract...');
65
+ *
66
+ * console.log(`Risk score: ${result.score}`);
67
+ * console.log(`Tags: ${result.tags.map(t => t.name).join(', ')}`);
68
+ *
69
+ * // Check for vulnerabilities
70
+ * if (result.source_code_analysis && 'vulnerabilities' in result.source_code_analysis) {
71
+ * for (const vuln of result.source_code_analysis.vulnerabilities) {
72
+ * console.warn(`${vuln.severity}: ${vuln.title}`);
73
+ * }
74
+ * }
75
+ * ```
76
+ */
77
+ async analyze(address, options = {}) {
78
+ const chain = this.resolveChain(options);
79
+ // Validate contract address format before making API call
80
+ if (!isValidAddress(address, chain)) {
81
+ const chainName = CHAIN_NAMES[chain] || chain;
82
+ throw new ValidationError(`Invalid ${chainName} contract address: "${address}". Please provide a valid address format for the ${chainName} blockchain.`);
83
+ }
84
+ const queryParams = new URLSearchParams();
85
+ queryParams.append('chain', chain);
86
+ if (options.deployerRisk !== undefined) {
87
+ queryParams.append('deployer_risk', String(options.deployerRisk));
88
+ }
89
+ const response = await this.httpClient.get(`/contracts/${encodeURIComponent(address)}?${queryParams.toString()}`, {
90
+ timeout: options.timeout,
91
+ signal: options.signal,
92
+ });
93
+ return response.data;
94
+ }
95
+ /**
96
+ * Get contract source code
97
+ *
98
+ * Returns source code and metadata for verified contracts.
99
+ *
100
+ * @param address - Contract address
101
+ * @param options - Request options (chain is optional if defaultChain is set)
102
+ * @returns Contract source code and metadata
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const source = await client.contracts.getSourceCode('0x...', {
107
+ * chain: Chain.ETH,
108
+ * });
109
+ *
110
+ * // With default chain configured
111
+ * const source = await client.contracts.getSourceCode('0x...');
112
+ *
113
+ * if (source.is_verified) {
114
+ * console.log(`Contract: ${source.contract_name}`);
115
+ * console.log(`Compiler: ${source.compiler_version}`);
116
+ * } else {
117
+ * console.log('Contract source not verified');
118
+ * }
119
+ * ```
120
+ */
121
+ async getSourceCode(address, options = {}) {
122
+ const chain = this.resolveChain(options);
123
+ // Validate contract address format before making API call
124
+ if (!isValidAddress(address, chain)) {
125
+ const chainName = CHAIN_NAMES[chain] || chain;
126
+ throw new ValidationError(`Invalid ${chainName} contract address: "${address}". Please provide a valid address format for the ${chainName} blockchain.`);
127
+ }
128
+ const queryParams = new URLSearchParams();
129
+ queryParams.append('chain', chain);
130
+ const response = await this.httpClient.get(`/contracts/${encodeURIComponent(address)}/source-code?${queryParams.toString()}`, {
131
+ timeout: options.timeout,
132
+ signal: options.signal,
133
+ });
134
+ return response.data;
135
+ }
136
+ /**
137
+ * Get token buy/sell taxes
138
+ *
139
+ * Analyzes token contracts for buy and sell taxes.
140
+ *
141
+ * @param address - Token contract address
142
+ * @param options - Request options (chain is optional if defaultChain is set)
143
+ * @returns Tax information
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const taxes = await client.contracts.getTaxes('0x...', {
148
+ * chain: Chain.ETH,
149
+ * });
150
+ *
151
+ * // With default chain configured
152
+ * const taxes = await client.contracts.getTaxes('0x...');
153
+ *
154
+ * if (taxes.buyTaxPercentage !== null || taxes.sellTaxPercentage !== null) {
155
+ * console.log(`Buy tax: ${taxes.buyTaxPercentage}%`);
156
+ * console.log(`Sell tax: ${taxes.sellTaxPercentage}%`);
157
+ * }
158
+ * ```
159
+ */
160
+ async getTaxes(address, options = {}) {
161
+ const chain = this.resolveChain(options);
162
+ // Validate token contract address format before making API call
163
+ if (!isValidAddress(address, chain)) {
164
+ const chainName = CHAIN_NAMES[chain] || chain;
165
+ throw new ValidationError(`Invalid ${chainName} token contract address: "${address}". Please provide a valid address format for the ${chainName} blockchain.`);
166
+ }
167
+ const queryParams = new URLSearchParams();
168
+ queryParams.append('chain', chain);
169
+ const response = await this.httpClient.get(`/contracts/taxes/${encodeURIComponent(address)}?${queryParams.toString()}`, {
170
+ timeout: options.timeout,
171
+ signal: options.signal,
172
+ });
173
+ return response.data;
174
+ }
175
+ /**
176
+ * Analyze Solidity source code
177
+ *
178
+ * Analyzes raw Solidity source code for vulnerabilities
179
+ * without requiring deployment.
180
+ *
181
+ * @param request - Analysis request with source code
182
+ * @returns Analysis results
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * const result = await client.contracts.analyzeSolidity({
187
+ * source_code: `
188
+ * pragma solidity ^0.8.0;
189
+ * contract MyToken {
190
+ * // ...
191
+ * }
192
+ * `,
193
+ * compiler_version: '0.8.19',
194
+ * });
195
+ *
196
+ * if (result.success && result.results) {
197
+ * console.log(`Security score: ${result.results.security_score}`);
198
+ * for (const vuln of result.results.vulnerabilities) {
199
+ * console.warn(`${vuln.severity}: ${vuln.title}`);
200
+ * }
201
+ * }
202
+ * ```
203
+ */
204
+ async analyzeSolidity(request, options) {
205
+ const response = await this.httpClient.post('/contracts/solidity-detector', request, {
206
+ timeout: options?.timeout,
207
+ signal: options?.signal,
208
+ });
209
+ return response.data;
210
+ }
211
+ }
212
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/resources/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { AddressesResource } from './addresses';
2
+ export { ContractsResource } from './contracts';
3
+ export { UrlResource } from './url';
4
+ export { WalletsResource } from './wallets';
5
+ export { LedgerResource } from './ledger';
6
+ export { AccountTraceResource } from './account-trace';
7
+ export { UsageResource } from './usage';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Resource for hardware wallet transaction scanning
3
+ *
4
+ * Provides security analysis for transactions before signing on
5
+ * hardware wallets (Ledger devices).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Scan a transaction before signing
10
+ * const result = await client.ledger.scanTransaction('ethereum', {
11
+ * tx: { from: '0x...', raw: '0x...' },
12
+ * chain: 1,
13
+ * });
14
+ *
15
+ * if (!result.is_safe) {
16
+ * console.error('Transaction may be risky!');
17
+ * }
18
+ * ```
19
+ */
20
+ export class LedgerResource {
21
+ httpClient;
22
+ constructor(httpClient) {
23
+ this.httpClient = httpClient;
24
+ }
25
+ /**
26
+ * Scan a transaction before signing
27
+ *
28
+ * Analyzes a transaction for security risks before signing
29
+ * on a hardware wallet.
30
+ *
31
+ * @param family - Ledger device family (ethereum, solana, bitcoin)
32
+ * @param request - Transaction scan request
33
+ * @param options - Request options
34
+ * @returns Security analysis result
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const result = await client.ledger.scanTransaction('ethereum', {
39
+ * tx: {
40
+ * from: '0xYourWallet...',
41
+ * raw: '0xEncodedTransaction...',
42
+ * },
43
+ * chain: 1, // Ethereum mainnet
44
+ * });
45
+ *
46
+ * if (!result.is_safe) {
47
+ * console.error(`Risk level: ${result.risk_level}`);
48
+ * for (const risk of result.risks) {
49
+ * console.warn(`${risk.level}: ${risk.description}`);
50
+ * }
51
+ * }
52
+ *
53
+ * // Check decoded data
54
+ * if (result.decoded?.function_name) {
55
+ * console.log(`Function: ${result.decoded.function_name}`);
56
+ * }
57
+ * ```
58
+ */
59
+ async scanTransaction(family, request, options) {
60
+ const response = await this.httpClient.post(`/ledger/${family}/scan/tx`, request, {
61
+ timeout: options?.timeout,
62
+ signal: options?.signal,
63
+ });
64
+ return response.data;
65
+ }
66
+ /**
67
+ * Scan EIP-712 typed data before signing
68
+ *
69
+ * Analyzes EIP-712 structured data for security risks
70
+ * before signing on a hardware wallet.
71
+ *
72
+ * @param family - Ledger device family
73
+ * @param request - EIP-712 scan request
74
+ * @param options - Request options
75
+ * @returns Security analysis result
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const result = await client.ledger.scanEip712('ethereum', {
80
+ * signer: '0xYourWallet...',
81
+ * typedData: {
82
+ * domain: {
83
+ * name: 'MyDApp',
84
+ * version: '1',
85
+ * chainId: 1,
86
+ * verifyingContract: '0x...',
87
+ * },
88
+ * message: {
89
+ * // Message content
90
+ * },
91
+ * primaryType: 'Order',
92
+ * types: {
93
+ * EIP712Domain: [
94
+ * { name: 'name', type: 'string' },
95
+ * // ...
96
+ * ],
97
+ * Order: [
98
+ * { name: 'maker', type: 'address' },
99
+ * // ...
100
+ * ],
101
+ * },
102
+ * },
103
+ * chain: 1,
104
+ * });
105
+ *
106
+ * if (!result.is_safe) {
107
+ * console.error('EIP-712 data may be risky!');
108
+ * }
109
+ * ```
110
+ */
111
+ async scanEip712(family, request, options) {
112
+ const response = await this.httpClient.post(`/ledger/${family}/scan/eip-712`, request, {
113
+ timeout: options?.timeout,
114
+ signal: options?.signal,
115
+ });
116
+ return response.data;
117
+ }
118
+ }
119
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/resources/ledger.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,KAAK,CAAC,eAAe,CACnB,MAAoB,EACpB,OAA0B,EAC1B,OAA2B;QAE3B,MAAM,QAAQ,GAAqC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAC3E,WAAW,MAAM,UAAU,EAC3B,OAAO,EACP;YACE,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,KAAK,CAAC,UAAU,CACd,MAAoB,EACpB,OAA4B,EAC5B,OAA2B;QAE3B,MAAM,QAAQ,GAAqC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAC3E,WAAW,MAAM,eAAe,EAChC,OAAO,EACP;YACE,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Resource for URL safety analysis
3
+ *
4
+ * Provides URL risk assessment to identify phishing sites,
5
+ * malicious domains, and other web-based threats.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const result = await client.url.check('https://suspicious-site.com');
10
+ * if (result.prediction === 'malicious') {
11
+ * console.warn('URL is malicious!');
12
+ * }
13
+ * ```
14
+ */
15
+ export class UrlResource {
16
+ httpClient;
17
+ constructor(httpClient) {
18
+ this.httpClient = httpClient;
19
+ }
20
+ /**
21
+ * Check if a URL is safe
22
+ *
23
+ * Analyzes a URL for phishing, malware, and other threats.
24
+ *
25
+ * @param url - URL to check
26
+ * @param options - Request options
27
+ * @returns URL safety analysis result
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const result = await client.url.check('https://example.com');
32
+ *
33
+ * if (result.prediction === 'malicious') {
34
+ * console.error('URL is potentially dangerous!');
35
+ * console.log('Details:', result.details);
36
+ * } else if (result.prediction === 'benign') {
37
+ * console.log('URL appears safe');
38
+ * }
39
+ *
40
+ * // Check blacklist/whitelist status
41
+ * if (result.blacklist === 'true') {
42
+ * console.error('URL is blacklisted');
43
+ * }
44
+ * if (result.whitelist === 'true') {
45
+ * console.log('URL is whitelisted');
46
+ * }
47
+ * ```
48
+ */
49
+ async check(url, options) {
50
+ const response = await this.httpClient.post('/url', { url }, {
51
+ timeout: options?.timeout,
52
+ signal: options?.signal,
53
+ });
54
+ return response.data;
55
+ }
56
+ /**
57
+ * Add a URL to the database
58
+ *
59
+ * Report a URL to be analyzed and added to the threat database.
60
+ *
61
+ * @param url - URL to add
62
+ * @param options - Request options
63
+ * @returns Addition result
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const result = await client.url.add('https://phishing-site.com');
68
+ * if (result.success) {
69
+ * console.log('URL reported successfully');
70
+ * }
71
+ * ```
72
+ */
73
+ async add(url, options) {
74
+ const response = await this.httpClient.post('/url/add', { url }, {
75
+ timeout: options?.timeout,
76
+ signal: options?.signal,
77
+ });
78
+ return response.data;
79
+ }
80
+ }
81
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/resources/url.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,OAAyB;QAChD,MAAM,QAAQ,GAAkC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACxE,MAAM,EACN,EAAE,GAAG,EAAE,EACP;YACE,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAyB;QAC9C,MAAM,QAAQ,GAAiC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACvE,UAAU,EACV,EAAE,GAAG,EAAE,EACP;YACE,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}