@tangram-mover/sdk 0.1.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/README.md +349 -0
- package/dist/src/analyzer/analyzer.d.ts +35 -0
- package/dist/src/analyzer/analyzer.d.ts.map +1 -0
- package/dist/src/analyzer/analyzer.js +74 -0
- package/dist/src/analyzer/analyzer.js.map +1 -0
- package/dist/src/analyzer/index.d.ts +7 -0
- package/dist/src/analyzer/index.d.ts.map +1 -0
- package/dist/src/analyzer/index.js +25 -0
- package/dist/src/analyzer/index.js.map +1 -0
- package/dist/src/analyzer/invariants.d.ts +25 -0
- package/dist/src/analyzer/invariants.d.ts.map +1 -0
- package/dist/src/analyzer/invariants.js +159 -0
- package/dist/src/analyzer/invariants.js.map +1 -0
- package/dist/src/analyzer/types.d.ts +63 -0
- package/dist/src/analyzer/types.d.ts.map +1 -0
- package/dist/src/analyzer/types.js +21 -0
- package/dist/src/analyzer/types.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +42 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tangram-mover.d.ts +95 -0
- package/dist/src/tangram-mover.d.ts.map +1 -0
- package/dist/src/tangram-mover.js +254 -0
- package/dist/src/tangram-mover.js.map +1 -0
- package/dist/src/tracer/index.d.ts +6 -0
- package/dist/src/tracer/index.d.ts.map +1 -0
- package/dist/src/tracer/index.js +24 -0
- package/dist/src/tracer/index.js.map +1 -0
- package/dist/src/tracer/tracer.d.ts +26 -0
- package/dist/src/tracer/tracer.d.ts.map +1 -0
- package/dist/src/tracer/tracer.js +123 -0
- package/dist/src/tracer/tracer.js.map +1 -0
- package/dist/src/tracer/types.d.ts +110 -0
- package/dist/src/tracer/types.d.ts.map +1 -0
- package/dist/src/tracer/types.js +7 -0
- package/dist/src/tracer/types.js.map +1 -0
- package/dist/src/types/index.d.ts +44 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +6 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/parsers.d.ts +10 -0
- package/dist/src/utils/parsers.d.ts.map +1 -0
- package/dist/src/utils/parsers.js +120 -0
- package/dist/src/utils/parsers.js.map +1 -0
- package/dist/src/utils/rpc-client.d.ts +32 -0
- package/dist/src/utils/rpc-client.d.ts.map +1 -0
- package/dist/src/utils/rpc-client.js +92 -0
- package/dist/src/utils/rpc-client.js.map +1 -0
- package/dist/tests/analyzer.test.d.ts +5 -0
- package/dist/tests/analyzer.test.d.ts.map +1 -0
- package/dist/tests/analyzer.test.js +128 -0
- package/dist/tests/analyzer.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +6 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +49 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/tracer.test.d.ts +5 -0
- package/dist/tests/tracer.test.d.ts.map +1 -0
- package/dist/tests/tracer.test.js +197 -0
- package/dist/tests/tracer.test.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# Tangram Mover TypeScript SDK
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for **Tangram Mover** - A comprehensive transaction trace analyzer for Sui Move protocols. Detect smart contract invariant violations, trace transactions, and execute transactions on the Sui network.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
✅ **Transaction Tracing** - Fetch and parse complete transaction traces including PTB commands, balance changes, object changes, and events
|
|
8
|
+
|
|
9
|
+
✅ **Invariant Detection** - Detect common security violations:
|
|
10
|
+
- Token inflation/deflation bugs
|
|
11
|
+
- Access control violations
|
|
12
|
+
- Ownership transfer anomalies
|
|
13
|
+
- Balance consistency issues
|
|
14
|
+
|
|
15
|
+
✅ **Transaction Execution** - Execute transactions using [sui-kit](https://github.com/scallop-io/sui-kit):
|
|
16
|
+
- Transfer SUI and custom coins
|
|
17
|
+
- Call Move functions
|
|
18
|
+
- Transfer objects
|
|
19
|
+
- HD wallet multi-account support
|
|
20
|
+
|
|
21
|
+
✅ **Batch Processing** - Process multiple transactions efficiently with rate limiting
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @tangram-mover/sdk @scallop-io/sui-kit
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
### Initialize the SDK
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { TangramMover } from '@tangram-mover/sdk';
|
|
35
|
+
|
|
36
|
+
// Initialize with secret key
|
|
37
|
+
const mover = new TangramMover({
|
|
38
|
+
secretKey: 'your-secret-key',
|
|
39
|
+
networkType: 'testnet', // 'mainnet' | 'testnet' | 'devnet'
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Or initialize with mnemonics
|
|
43
|
+
const mover = new TangramMover({
|
|
44
|
+
mnemonics: 'word1 word2 ... word12',
|
|
45
|
+
networkType: 'testnet',
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Or create a new HD wallet
|
|
49
|
+
const mover = new TangramMover({
|
|
50
|
+
networkType: 'testnet',
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Trace a Transaction
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Fetch and parse transaction trace
|
|
58
|
+
const trace = await mover.traceTransaction('transaction-digest-here');
|
|
59
|
+
|
|
60
|
+
console.log('Transaction:', trace.digest);
|
|
61
|
+
console.log('Sender:', trace.sender);
|
|
62
|
+
console.log('Status:', trace.status);
|
|
63
|
+
console.log('Balance Changes:', trace.balance_changes);
|
|
64
|
+
console.log('PTB Commands:', trace.ptb_commands);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Analyze for Invariant Violations
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// Analyze a single transaction
|
|
71
|
+
const analysis = await mover.analyzeTransaction('transaction-digest-here');
|
|
72
|
+
|
|
73
|
+
console.log('Status:', analysis.status); // 'safe' | 'violations_detected'
|
|
74
|
+
console.log('Violations:', analysis.summary.violations);
|
|
75
|
+
console.log('Critical Violations:', analysis.summary.critical_violations);
|
|
76
|
+
|
|
77
|
+
// Check individual invariant results
|
|
78
|
+
analysis.invariants.forEach(inv => {
|
|
79
|
+
if (inv.violated) {
|
|
80
|
+
console.log(`⚠️ ${inv.name}: ${inv.message}`);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Trace and Analyze in One Call
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Get both trace data and analysis
|
|
89
|
+
const result = await mover.traceAndAnalyze('transaction-digest-here');
|
|
90
|
+
|
|
91
|
+
console.log('Trace:', result.trace);
|
|
92
|
+
console.log('Analysis:', result.analysis);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Execute Transactions
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Transfer SUI
|
|
99
|
+
const result = await mover.transferSui('0xrecipient-address', 1000000000); // 1 SUI
|
|
100
|
+
console.log('Transaction Digest:', result.digest);
|
|
101
|
+
|
|
102
|
+
// Transfer custom coin
|
|
103
|
+
const coinResult = await mover.transferCoin(
|
|
104
|
+
'0xrecipient-address',
|
|
105
|
+
1000000,
|
|
106
|
+
'0xpackage::module::CoinType'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// Call Move function
|
|
110
|
+
const moveResult = await mover.moveCall(
|
|
111
|
+
'0xpackage::module::function',
|
|
112
|
+
[arg1, arg2],
|
|
113
|
+
['TypeArg1']
|
|
114
|
+
);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Batch Operations
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// Trace multiple transactions
|
|
121
|
+
const traces = await mover.traceTransactions([
|
|
122
|
+
'digest1',
|
|
123
|
+
'digest2',
|
|
124
|
+
'digest3',
|
|
125
|
+
]);
|
|
126
|
+
|
|
127
|
+
// Analyze multiple transactions
|
|
128
|
+
const analyses = await mover.analyzeTransactions([
|
|
129
|
+
'digest1',
|
|
130
|
+
'digest2',
|
|
131
|
+
'digest3',
|
|
132
|
+
]);
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### HD Wallet Multi-Accounts
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Get address for different account indices
|
|
139
|
+
const addr0 = mover.getAddress({ accountIndex: 0 });
|
|
140
|
+
const addr1 = mover.getAddress({ accountIndex: 1 });
|
|
141
|
+
|
|
142
|
+
// Execute transaction from specific account
|
|
143
|
+
await mover.transferSui('0xrecipient', 1000000, { accountIndex: 1 });
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## API Reference
|
|
147
|
+
|
|
148
|
+
### TangramMover
|
|
149
|
+
|
|
150
|
+
Main SDK class that provides all functionality.
|
|
151
|
+
|
|
152
|
+
#### Constructor Options
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
interface TangramMoverOptions {
|
|
156
|
+
secretKey?: string; // Base64, hex, or legacy format key
|
|
157
|
+
mnemonics?: string; // 12 or 24 word mnemonic phrase
|
|
158
|
+
networkType?: NetworkType; // 'mainnet' | 'testnet' | 'devnet' | 'localnet'
|
|
159
|
+
fullnodeUrls?: string[]; // Custom fullnode URLs
|
|
160
|
+
faucetUrl?: string; // Custom faucet URL
|
|
161
|
+
accountIndex?: number; // HD wallet account index (default: 0)
|
|
162
|
+
rateLimitMs?: number; // Rate limit between RPC calls (default: 1000)
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### Methods
|
|
167
|
+
|
|
168
|
+
**Transaction Tracing**
|
|
169
|
+
- `traceTransaction(digest: string): Promise<TraceData>`
|
|
170
|
+
- `traceTransactions(digests: string[]): Promise<TraceData[]>`
|
|
171
|
+
|
|
172
|
+
**Invariant Analysis**
|
|
173
|
+
- `analyzeTransaction(digest: string): Promise<AnalysisResult>`
|
|
174
|
+
- `analyzeTransactions(digests: string[]): Promise<AnalysisResult[]>`
|
|
175
|
+
- `traceAndAnalyze(digest: string): Promise<TraceAndAnalysisResult>`
|
|
176
|
+
|
|
177
|
+
**Transaction Execution**
|
|
178
|
+
- `transferSui(recipient: string, amount: number, options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
179
|
+
- `transferSuiToMany(recipients: string[], amounts: number[], options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
180
|
+
- `transferCoin(recipient: string, amount: number, coinType: string, options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
181
|
+
- `transferCoinToMany(recipients: string[], amounts: number[], coinType: string, options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
182
|
+
- `moveCall(target: string, arguments: any[], typeArguments?: string[], options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
183
|
+
- `transferObjects(objectIds: string[], recipient: string, options?: { accountIndex?: number }): Promise<TransactionResult>`
|
|
184
|
+
|
|
185
|
+
**Utilities**
|
|
186
|
+
- `getCurrentAddress(): string`
|
|
187
|
+
- `getAddress(options?: { accountIndex?: number }): string`
|
|
188
|
+
- `getBalance(coinType?: string, options?: { accountIndex?: number }): Promise<{ totalBalance: number }>`
|
|
189
|
+
|
|
190
|
+
### TraceData
|
|
191
|
+
|
|
192
|
+
Complete transaction trace information.
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
interface TraceData {
|
|
196
|
+
digest: string;
|
|
197
|
+
sender: string;
|
|
198
|
+
status: string;
|
|
199
|
+
gas_computation: number;
|
|
200
|
+
gas_storage: number;
|
|
201
|
+
gas_storage_rebate: number;
|
|
202
|
+
events: SuiEvent[];
|
|
203
|
+
balance_changes: BalanceChange[];
|
|
204
|
+
object_changes: ObjectChange[];
|
|
205
|
+
ptb_commands: PTBCommand[];
|
|
206
|
+
num_commands: number;
|
|
207
|
+
num_events: number;
|
|
208
|
+
num_balance_changes: number;
|
|
209
|
+
num_object_changes: number;
|
|
210
|
+
objects_created: number;
|
|
211
|
+
objects_mutated: number;
|
|
212
|
+
objects_deleted: number;
|
|
213
|
+
has_move_calls: boolean;
|
|
214
|
+
net_balance_change: number | string;
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### AnalysisResult
|
|
219
|
+
|
|
220
|
+
Result of invariant analysis.
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
interface AnalysisResult {
|
|
224
|
+
digest: string;
|
|
225
|
+
timestamp: string;
|
|
226
|
+
status: 'safe' | 'violations_detected' | 'error';
|
|
227
|
+
invariants: InvariantResult[];
|
|
228
|
+
summary: {
|
|
229
|
+
total_checks: number;
|
|
230
|
+
violations: number;
|
|
231
|
+
critical_violations: number;
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Invariant Checks
|
|
237
|
+
|
|
238
|
+
The SDK includes several built-in invariant checks:
|
|
239
|
+
|
|
240
|
+
1. **Inflation Detection** - Detects when tokens are created out of thin air (positive net balance change)
|
|
241
|
+
2. **Access Control** - Basic validation of authorized operations (extendable for protocol-specific checks)
|
|
242
|
+
3. **Ownership Consistency** - Validates object ownership transfers
|
|
243
|
+
4. **Balance Consistency** - Ensures balance changes match object changes
|
|
244
|
+
|
|
245
|
+
### Adding Custom Invariants
|
|
246
|
+
|
|
247
|
+
You can extend the analyzer with custom invariant checks:
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
import { Analyzer } from '@tangram-mover/sdk';
|
|
251
|
+
import type { TraceData } from '@tangram-mover/sdk';
|
|
252
|
+
|
|
253
|
+
const analyzer = new Analyzer();
|
|
254
|
+
|
|
255
|
+
// Add custom check
|
|
256
|
+
function checkCustomInvariant(traceData: TraceData): InvariantResult {
|
|
257
|
+
// Your custom logic here
|
|
258
|
+
return {
|
|
259
|
+
name: 'custom_check',
|
|
260
|
+
violated: false,
|
|
261
|
+
message: 'Custom check passed',
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Use in your analysis
|
|
266
|
+
const trace = await mover.traceTransaction('digest');
|
|
267
|
+
const customResult = checkCustomInvariant(trace);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Examples
|
|
271
|
+
|
|
272
|
+
### Monitor Protocol Transactions
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
import { TangramMover } from '@tangram-mover/sdk';
|
|
276
|
+
|
|
277
|
+
const mover = new TangramMover({ networkType: 'mainnet' });
|
|
278
|
+
|
|
279
|
+
async function monitorTransaction(digest: string) {
|
|
280
|
+
const result = await mover.traceAndAnalyze(digest);
|
|
281
|
+
|
|
282
|
+
if (result.analysis.status === 'violations_detected') {
|
|
283
|
+
console.error('🚨 INVARIANT VIOLATION DETECTED!');
|
|
284
|
+
console.error('Transaction:', digest);
|
|
285
|
+
|
|
286
|
+
result.analysis.invariants.forEach(inv => {
|
|
287
|
+
if (inv.violated) {
|
|
288
|
+
console.error(` - ${inv.name}: ${inv.message}`);
|
|
289
|
+
if (inv.severity === 'critical') {
|
|
290
|
+
// Send alert, pause protocol, etc.
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
} else {
|
|
295
|
+
console.log('✅ Transaction is safe');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Batch Analysis
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
async function analyzeBatch(digests: string[]) {
|
|
304
|
+
const analyses = await mover.analyzeTransactions(digests);
|
|
305
|
+
|
|
306
|
+
const violations = analyses.filter(a => a.status === 'violations_detected');
|
|
307
|
+
const critical = violations.filter(a =>
|
|
308
|
+
a.summary.critical_violations > 0
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
console.log(`Analyzed ${digests.length} transactions`);
|
|
312
|
+
console.log(`Found ${violations.length} with violations`);
|
|
313
|
+
console.log(`Found ${critical.length} with critical violations`);
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Development
|
|
318
|
+
|
|
319
|
+
### Build
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
npm run build
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Test
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
npm test
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Lint
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
npm run lint
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Related Projects
|
|
338
|
+
|
|
339
|
+
- [Tangram Mover Rust Crawler](../crawler/) - High-performance Rust implementation for batch processing
|
|
340
|
+
- [Tangram Mover Python Analyzer](../analysis/) - Python-based invariant detection
|
|
341
|
+
- [sui-kit](https://github.com/scallop-io/sui-kit) - Sui network interaction toolkit
|
|
342
|
+
|
|
343
|
+
## License
|
|
344
|
+
|
|
345
|
+
MIT
|
|
346
|
+
|
|
347
|
+
## Contributing
|
|
348
|
+
|
|
349
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invariant analyzer for transaction traces
|
|
3
|
+
*/
|
|
4
|
+
import type { TraceData } from '../tracer/types';
|
|
5
|
+
import type { AnalysisResult, InvariantResult } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Analyzer class for detecting invariant violations
|
|
8
|
+
*/
|
|
9
|
+
export declare class Analyzer {
|
|
10
|
+
/**
|
|
11
|
+
* Analyze transaction trace and detect invariant violations
|
|
12
|
+
*/
|
|
13
|
+
analyze(traceData: TraceData): Promise<AnalysisResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Check inflation invariant only
|
|
16
|
+
*/
|
|
17
|
+
checkInflationInvariant(traceData: TraceData): InvariantResult;
|
|
18
|
+
/**
|
|
19
|
+
* Check access control invariant only
|
|
20
|
+
*/
|
|
21
|
+
checkAccessControlInvariant(traceData: TraceData): InvariantResult;
|
|
22
|
+
/**
|
|
23
|
+
* Check ownership invariant only
|
|
24
|
+
*/
|
|
25
|
+
checkOwnershipInvariant(traceData: TraceData): InvariantResult;
|
|
26
|
+
/**
|
|
27
|
+
* Check balance consistency invariant only
|
|
28
|
+
*/
|
|
29
|
+
checkBalanceConsistencyInvariant(traceData: TraceData): InvariantResult;
|
|
30
|
+
/**
|
|
31
|
+
* Analyze multiple transactions
|
|
32
|
+
*/
|
|
33
|
+
analyzeMultiple(traceDataArray: TraceData[]): Promise<AnalysisResult[]>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzer/analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/D;;GAEG;AACH,qBAAa,QAAQ;IACnB;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC;IAkC5D;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAI9D;;OAEG;IACH,2BAA2B,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAIlE;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAI9D;;OAEG;IACH,gCAAgC,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe;IAIvE;;OAEG;IACG,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAG9E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Invariant analyzer for transaction traces
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Analyzer = void 0;
|
|
7
|
+
const invariants_1 = require("./invariants");
|
|
8
|
+
/**
|
|
9
|
+
* Analyzer class for detecting invariant violations
|
|
10
|
+
*/
|
|
11
|
+
class Analyzer {
|
|
12
|
+
/**
|
|
13
|
+
* Analyze transaction trace and detect invariant violations
|
|
14
|
+
*/
|
|
15
|
+
async analyze(traceData) {
|
|
16
|
+
const invariants = [];
|
|
17
|
+
// Run all invariant checks
|
|
18
|
+
invariants.push((0, invariants_1.checkInflationInvariant)(traceData));
|
|
19
|
+
invariants.push((0, invariants_1.checkAccessControlInvariant)(traceData));
|
|
20
|
+
invariants.push((0, invariants_1.checkOwnershipInvariant)(traceData));
|
|
21
|
+
invariants.push((0, invariants_1.checkBalanceConsistencyInvariant)(traceData));
|
|
22
|
+
// Calculate summary
|
|
23
|
+
const violations = invariants.filter(inv => inv.violated);
|
|
24
|
+
const critical_violations = violations.filter(inv => inv.severity === 'critical').length;
|
|
25
|
+
// Determine overall status
|
|
26
|
+
let status = 'safe';
|
|
27
|
+
if (violations.length > 0) {
|
|
28
|
+
status = 'violations_detected';
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
digest: traceData.digest,
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
status,
|
|
34
|
+
invariants,
|
|
35
|
+
summary: {
|
|
36
|
+
total_checks: invariants.length,
|
|
37
|
+
violations: violations.length,
|
|
38
|
+
critical_violations,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check inflation invariant only
|
|
44
|
+
*/
|
|
45
|
+
checkInflationInvariant(traceData) {
|
|
46
|
+
return (0, invariants_1.checkInflationInvariant)(traceData);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check access control invariant only
|
|
50
|
+
*/
|
|
51
|
+
checkAccessControlInvariant(traceData) {
|
|
52
|
+
return (0, invariants_1.checkAccessControlInvariant)(traceData);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check ownership invariant only
|
|
56
|
+
*/
|
|
57
|
+
checkOwnershipInvariant(traceData) {
|
|
58
|
+
return (0, invariants_1.checkOwnershipInvariant)(traceData);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check balance consistency invariant only
|
|
62
|
+
*/
|
|
63
|
+
checkBalanceConsistencyInvariant(traceData) {
|
|
64
|
+
return (0, invariants_1.checkBalanceConsistencyInvariant)(traceData);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Analyze multiple transactions
|
|
68
|
+
*/
|
|
69
|
+
async analyzeMultiple(traceDataArray) {
|
|
70
|
+
return Promise.all(traceDataArray.map(trace => this.analyze(trace)));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.Analyzer = Analyzer;
|
|
74
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/analyzer.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,6CAKsB;AAEtB;;GAEG;AACH,MAAa,QAAQ;IACnB;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAoB;QAChC,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,2BAA2B;QAC3B,UAAU,CAAC,IAAI,CAAC,IAAA,oCAAuB,EAAC,SAAS,CAAC,CAAC,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC,IAAA,wCAA2B,EAAC,SAAS,CAAC,CAAC,CAAC;QACxD,UAAU,CAAC,IAAI,CAAC,IAAA,oCAAuB,EAAC,SAAS,CAAC,CAAC,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC,IAAA,6CAAgC,EAAC,SAAS,CAAC,CAAC,CAAC;QAE7D,oBAAoB;QACpB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAC3C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,UAAU,CACnC,CAAC,MAAM,CAAC;QAET,2BAA2B;QAC3B,IAAI,MAAM,GAA6C,MAAM,CAAC;QAC9D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,qBAAqB,CAAC;QACjC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM;YACN,UAAU;YACV,OAAO,EAAE;gBACP,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,UAAU,EAAE,UAAU,CAAC,MAAM;gBAC7B,mBAAmB;aACpB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,SAAoB;QAC1C,OAAO,IAAA,oCAAuB,EAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,2BAA2B,CAAC,SAAoB;QAC9C,OAAO,IAAA,wCAA2B,EAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,SAAoB;QAC1C,OAAO,IAAA,oCAAuB,EAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,gCAAgC,CAAC,SAAoB;QACnD,OAAO,IAAA,6CAAgC,EAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,cAA2B;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AAxED,4BAwEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Analyzer module exports
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.Analyzer = void 0;
|
|
21
|
+
var analyzer_1 = require("./analyzer");
|
|
22
|
+
Object.defineProperty(exports, "Analyzer", { enumerable: true, get: function () { return analyzer_1.Analyzer; } });
|
|
23
|
+
__exportStar(require("./invariants"), exports);
|
|
24
|
+
__exportStar(require("./types"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzer/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA6B;AAC7B,0CAAwB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invariant detection logic
|
|
3
|
+
*/
|
|
4
|
+
import type { TraceData } from '../tracer/types';
|
|
5
|
+
import type { InvariantResult } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Check for token inflation/deflation violations
|
|
8
|
+
* Invariant: Sum of balance changes should be <= 0 (excluding mints/burns)
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkInflationInvariant(traceData: TraceData): InvariantResult;
|
|
11
|
+
/**
|
|
12
|
+
* Check for access control violations
|
|
13
|
+
* This is a placeholder - actual implementation would need protocol-specific logic
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkAccessControlInvariant(traceData: TraceData): InvariantResult;
|
|
16
|
+
/**
|
|
17
|
+
* Check for ownership transfer anomalies
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkOwnershipInvariant(traceData: TraceData): InvariantResult;
|
|
20
|
+
/**
|
|
21
|
+
* Check for balance consistency
|
|
22
|
+
* Verify that balance changes match object changes
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkBalanceConsistencyInvariant(traceData: TraceData): InvariantResult;
|
|
25
|
+
//# sourceMappingURL=invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../../src/analyzer/invariants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CAuD7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CAqBjF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CAgD7E;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CA6BtF"}
|