@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.
Files changed (62) hide show
  1. package/README.md +349 -0
  2. package/dist/src/analyzer/analyzer.d.ts +35 -0
  3. package/dist/src/analyzer/analyzer.d.ts.map +1 -0
  4. package/dist/src/analyzer/analyzer.js +74 -0
  5. package/dist/src/analyzer/analyzer.js.map +1 -0
  6. package/dist/src/analyzer/index.d.ts +7 -0
  7. package/dist/src/analyzer/index.d.ts.map +1 -0
  8. package/dist/src/analyzer/index.js +25 -0
  9. package/dist/src/analyzer/index.js.map +1 -0
  10. package/dist/src/analyzer/invariants.d.ts +25 -0
  11. package/dist/src/analyzer/invariants.d.ts.map +1 -0
  12. package/dist/src/analyzer/invariants.js +159 -0
  13. package/dist/src/analyzer/invariants.js.map +1 -0
  14. package/dist/src/analyzer/types.d.ts +63 -0
  15. package/dist/src/analyzer/types.d.ts.map +1 -0
  16. package/dist/src/analyzer/types.js +21 -0
  17. package/dist/src/analyzer/types.js.map +1 -0
  18. package/dist/src/index.d.ts +14 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +42 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/tangram-mover.d.ts +95 -0
  23. package/dist/src/tangram-mover.d.ts.map +1 -0
  24. package/dist/src/tangram-mover.js +254 -0
  25. package/dist/src/tangram-mover.js.map +1 -0
  26. package/dist/src/tracer/index.d.ts +6 -0
  27. package/dist/src/tracer/index.d.ts.map +1 -0
  28. package/dist/src/tracer/index.js +24 -0
  29. package/dist/src/tracer/index.js.map +1 -0
  30. package/dist/src/tracer/tracer.d.ts +26 -0
  31. package/dist/src/tracer/tracer.d.ts.map +1 -0
  32. package/dist/src/tracer/tracer.js +123 -0
  33. package/dist/src/tracer/tracer.js.map +1 -0
  34. package/dist/src/tracer/types.d.ts +110 -0
  35. package/dist/src/tracer/types.d.ts.map +1 -0
  36. package/dist/src/tracer/types.js +7 -0
  37. package/dist/src/tracer/types.js.map +1 -0
  38. package/dist/src/types/index.d.ts +44 -0
  39. package/dist/src/types/index.d.ts.map +1 -0
  40. package/dist/src/types/index.js +6 -0
  41. package/dist/src/types/index.js.map +1 -0
  42. package/dist/src/utils/parsers.d.ts +10 -0
  43. package/dist/src/utils/parsers.d.ts.map +1 -0
  44. package/dist/src/utils/parsers.js +120 -0
  45. package/dist/src/utils/parsers.js.map +1 -0
  46. package/dist/src/utils/rpc-client.d.ts +32 -0
  47. package/dist/src/utils/rpc-client.d.ts.map +1 -0
  48. package/dist/src/utils/rpc-client.js +92 -0
  49. package/dist/src/utils/rpc-client.js.map +1 -0
  50. package/dist/tests/analyzer.test.d.ts +5 -0
  51. package/dist/tests/analyzer.test.d.ts.map +1 -0
  52. package/dist/tests/analyzer.test.js +128 -0
  53. package/dist/tests/analyzer.test.js.map +1 -0
  54. package/dist/tests/integration.test.d.ts +6 -0
  55. package/dist/tests/integration.test.d.ts.map +1 -0
  56. package/dist/tests/integration.test.js +49 -0
  57. package/dist/tests/integration.test.js.map +1 -0
  58. package/dist/tests/tracer.test.d.ts +5 -0
  59. package/dist/tests/tracer.test.d.ts.map +1 -0
  60. package/dist/tests/tracer.test.js +197 -0
  61. package/dist/tests/tracer.test.js.map +1 -0
  62. package/package.json +44 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * Invariant detection logic
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.checkInflationInvariant = checkInflationInvariant;
7
+ exports.checkAccessControlInvariant = checkAccessControlInvariant;
8
+ exports.checkOwnershipInvariant = checkOwnershipInvariant;
9
+ exports.checkBalanceConsistencyInvariant = checkBalanceConsistencyInvariant;
10
+ const types_1 = require("./types");
11
+ /**
12
+ * Check for token inflation/deflation violations
13
+ * Invariant: Sum of balance changes should be <= 0 (excluding mints/burns)
14
+ */
15
+ function checkInflationInvariant(traceData) {
16
+ const balanceChanges = traceData.balance_changes;
17
+ if (!balanceChanges || balanceChanges.length === 0) {
18
+ return {
19
+ name: 'inflation',
20
+ violated: false,
21
+ message: 'No balance changes detected',
22
+ };
23
+ }
24
+ // Group by coin type and calculate net change
25
+ const coinTotals = {};
26
+ for (const change of balanceChanges) {
27
+ const coinType = change.coinType;
28
+ const amount = typeof change.amount === 'string'
29
+ ? parseInt(change.amount)
30
+ : change.amount;
31
+ if (!coinTotals[coinType]) {
32
+ coinTotals[coinType] = 0;
33
+ }
34
+ coinTotals[coinType] += amount;
35
+ }
36
+ // Check for violations (positive net change = inflation)
37
+ const violations = [];
38
+ for (const [coinType, total] of Object.entries(coinTotals)) {
39
+ if (total > 0) {
40
+ violations.push({ coinType, netChange: total });
41
+ }
42
+ }
43
+ if (violations.length > 0) {
44
+ return {
45
+ name: 'inflation',
46
+ violated: true,
47
+ severity: types_1.InvariantSeverity.CRITICAL,
48
+ message: `Token inflation detected: ${violations.length} coin type(s) with positive net balance change`,
49
+ details: {
50
+ violations,
51
+ coinTotals,
52
+ },
53
+ };
54
+ }
55
+ return {
56
+ name: 'inflation',
57
+ violated: false,
58
+ message: 'Inflation invariant passed',
59
+ details: { coinTotals },
60
+ };
61
+ }
62
+ /**
63
+ * Check for access control violations
64
+ * This is a placeholder - actual implementation would need protocol-specific logic
65
+ */
66
+ function checkAccessControlInvariant(traceData) {
67
+ // For now, this is a basic check
68
+ // Real implementation would need to verify:
69
+ // - Only authorized addresses can perform privileged operations
70
+ // - Capability objects are properly checked
71
+ // - Signer requirements are met
72
+ const moveCalls = traceData.ptb_commands.filter(cmd => cmd.command_type === 'MoveCall');
73
+ // Basic check: if there are move calls, we assume they're authorized
74
+ // (This would need protocol-specific validation in a real implementation)
75
+ return {
76
+ name: 'access_control',
77
+ violated: false,
78
+ message: 'Access control check passed (basic validation)',
79
+ details: {
80
+ moveCallsCount: moveCalls.length,
81
+ note: 'Full access control validation requires protocol-specific logic',
82
+ },
83
+ };
84
+ }
85
+ /**
86
+ * Check for ownership transfer anomalies
87
+ */
88
+ function checkOwnershipInvariant(traceData) {
89
+ const objectChanges = traceData.object_changes;
90
+ if (!objectChanges || objectChanges.length === 0) {
91
+ return {
92
+ name: 'ownership',
93
+ violated: false,
94
+ message: 'No object changes detected',
95
+ };
96
+ }
97
+ // Check for suspicious ownership transfers
98
+ const suspiciousTransfers = [];
99
+ for (const change of objectChanges) {
100
+ // Check for objects transferred to/from unexpected addresses
101
+ // This is a simplified check - real implementation would need more context
102
+ if (change.type === 'mutated' && change.previousOwner && change.owner) {
103
+ // Basic validation: ownership should be consistent
104
+ // More sophisticated checks would verify:
105
+ // - Previous owner had permission to transfer
106
+ // - New owner is valid
107
+ // - Transfer follows protocol rules
108
+ }
109
+ }
110
+ if (suspiciousTransfers.length > 0) {
111
+ return {
112
+ name: 'ownership',
113
+ violated: true,
114
+ severity: types_1.InvariantSeverity.HIGH,
115
+ message: `Suspicious ownership transfers detected: ${suspiciousTransfers.length}`,
116
+ details: { suspiciousTransfers },
117
+ };
118
+ }
119
+ return {
120
+ name: 'ownership',
121
+ violated: false,
122
+ message: 'Ownership invariant passed',
123
+ details: {
124
+ totalObjectChanges: objectChanges.length,
125
+ },
126
+ };
127
+ }
128
+ /**
129
+ * Check for balance consistency
130
+ * Verify that balance changes match object changes
131
+ */
132
+ function checkBalanceConsistencyInvariant(traceData) {
133
+ const balanceChanges = traceData.balance_changes;
134
+ const objectChanges = traceData.object_changes;
135
+ // Basic check: if there are balance changes, there should be corresponding object changes
136
+ // This is simplified - real implementation would need to match specific objects
137
+ if (balanceChanges.length > 0 && objectChanges.length === 0) {
138
+ return {
139
+ name: 'balance_consistency',
140
+ violated: true,
141
+ severity: types_1.InvariantSeverity.MEDIUM,
142
+ message: 'Balance changes detected without corresponding object changes',
143
+ details: {
144
+ balanceChangesCount: balanceChanges.length,
145
+ objectChangesCount: objectChanges.length,
146
+ },
147
+ };
148
+ }
149
+ return {
150
+ name: 'balance_consistency',
151
+ violated: false,
152
+ message: 'Balance consistency check passed',
153
+ details: {
154
+ balanceChangesCount: balanceChanges.length,
155
+ objectChangesCount: objectChanges.length,
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=invariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/analyzer/invariants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Type definitions for invariant analysis
3
+ */
4
+ /**
5
+ * Severity level of an invariant violation
6
+ */
7
+ export declare enum InvariantSeverity {
8
+ /** Critical violation - immediate action required */
9
+ CRITICAL = "critical",
10
+ /** High severity - likely exploit */
11
+ HIGH = "high",
12
+ /** Medium severity - suspicious but may be legitimate */
13
+ MEDIUM = "medium",
14
+ /** Low severity - minor anomaly */
15
+ LOW = "low"
16
+ }
17
+ /**
18
+ * Result of checking a single invariant
19
+ */
20
+ export interface InvariantResult {
21
+ /** Name of the invariant check */
22
+ name: string;
23
+ /** Whether a violation was detected */
24
+ violated: boolean;
25
+ /** Severity of the violation (if violated) */
26
+ severity?: InvariantSeverity;
27
+ /** Human-readable message describing the violation */
28
+ message?: string;
29
+ /** Additional details about the violation */
30
+ details?: Record<string, any>;
31
+ }
32
+ /**
33
+ * Complete analysis result for a transaction
34
+ */
35
+ export interface AnalysisResult {
36
+ /** Transaction digest */
37
+ digest: string;
38
+ /** Timestamp of analysis */
39
+ timestamp: string;
40
+ /** Overall status */
41
+ status: 'safe' | 'violations_detected' | 'error';
42
+ /** List of invariant check results */
43
+ invariants: InvariantResult[];
44
+ /** Summary statistics */
45
+ summary: {
46
+ /** Total number of checks performed */
47
+ total_checks: number;
48
+ /** Number of violations detected */
49
+ violations: number;
50
+ /** Number of critical violations */
51
+ critical_violations: number;
52
+ };
53
+ }
54
+ /**
55
+ * Combined trace and analysis result
56
+ */
57
+ export interface TraceAndAnalysisResult {
58
+ /** Transaction trace data */
59
+ trace: import('../tracer/types').TraceData;
60
+ /** Analysis result */
61
+ analysis: AnalysisResult;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzer/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,qDAAqD;IACrD,QAAQ,aAAa;IACrB,qCAAqC;IACrC,IAAI,SAAS;IACb,yDAAyD;IACzD,MAAM,WAAW;IACjB,mCAAmC;IACnC,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,OAAO,CAAC;IACjD,sCAAsC;IACtC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,yBAAyB;IACzB,OAAO,EAAE;QACP,uCAAuC;QACvC,YAAY,EAAE,MAAM,CAAC;QACrB,oCAAoC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,oCAAoC;QACpC,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,KAAK,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC;IAC3C,sBAAsB;IACtB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for invariant analysis
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InvariantSeverity = void 0;
7
+ /**
8
+ * Severity level of an invariant violation
9
+ */
10
+ var InvariantSeverity;
11
+ (function (InvariantSeverity) {
12
+ /** Critical violation - immediate action required */
13
+ InvariantSeverity["CRITICAL"] = "critical";
14
+ /** High severity - likely exploit */
15
+ InvariantSeverity["HIGH"] = "high";
16
+ /** Medium severity - suspicious but may be legitimate */
17
+ InvariantSeverity["MEDIUM"] = "medium";
18
+ /** Low severity - minor anomaly */
19
+ InvariantSeverity["LOW"] = "low";
20
+ })(InvariantSeverity || (exports.InvariantSeverity = InvariantSeverity = {}));
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzer/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH;;GAEG;AACH,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,qDAAqD;IACrD,0CAAqB,CAAA;IACrB,qCAAqC;IACrC,kCAAa,CAAA;IACb,yDAAyD;IACzD,sCAAiB,CAAA;IACjB,mCAAmC;IACnC,gCAAW,CAAA;AACb,CAAC,EATW,iBAAiB,iCAAjB,iBAAiB,QAS5B"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tangram Mover TypeScript SDK
3
+ * Main entry point - exports all public APIs
4
+ */
5
+ export { TangramMover } from './tangram-mover';
6
+ export { Tracer } from './tracer/tracer';
7
+ export * from './tracer/types';
8
+ export { Analyzer } from './analyzer/analyzer';
9
+ export * from './analyzer/types';
10
+ export * from './analyzer/invariants';
11
+ export { RpcClient } from './utils/rpc-client';
12
+ export * from './types';
13
+ export { SuiKit } from '@scallop-io/sui-kit';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Tangram Mover TypeScript SDK
4
+ * Main entry point - exports all public APIs
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.SuiKit = exports.RpcClient = exports.Analyzer = exports.Tracer = exports.TangramMover = void 0;
22
+ // Main SDK class
23
+ var tangram_mover_1 = require("./tangram-mover");
24
+ Object.defineProperty(exports, "TangramMover", { enumerable: true, get: function () { return tangram_mover_1.TangramMover; } });
25
+ // Tracer exports
26
+ var tracer_1 = require("./tracer/tracer");
27
+ Object.defineProperty(exports, "Tracer", { enumerable: true, get: function () { return tracer_1.Tracer; } });
28
+ __exportStar(require("./tracer/types"), exports);
29
+ // Analyzer exports
30
+ var analyzer_1 = require("./analyzer/analyzer");
31
+ Object.defineProperty(exports, "Analyzer", { enumerable: true, get: function () { return analyzer_1.Analyzer; } });
32
+ __exportStar(require("./analyzer/types"), exports);
33
+ __exportStar(require("./analyzer/invariants"), exports);
34
+ // Utility exports
35
+ var rpc_client_1 = require("./utils/rpc-client");
36
+ Object.defineProperty(exports, "RpcClient", { enumerable: true, get: function () { return rpc_client_1.RpcClient; } });
37
+ // Type exports
38
+ __exportStar(require("./types"), exports);
39
+ // Re-export SuiKit for convenience
40
+ var sui_kit_1 = require("@scallop-io/sui-kit");
41
+ Object.defineProperty(exports, "SuiKit", { enumerable: true, get: function () { return sui_kit_1.SuiKit; } });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,iBAAiB;AACjB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,0CAAyC;AAAhC,gGAAA,MAAM,OAAA;AACf,iDAA+B;AAE/B,mBAAmB;AACnB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,mDAAiC;AACjC,wDAAsC;AAEtC,kBAAkB;AAClB,iDAA+C;AAAtC,uGAAA,SAAS,OAAA;AAElB,eAAe;AACf,0CAAwB;AAExB,mCAAmC;AACnC,+CAA6C;AAApC,iGAAA,MAAM,OAAA"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Main TangramMover SDK class
3
+ * Integrates transaction tracing, invariant analysis, and transaction execution
4
+ */
5
+ import type { TangramMoverOptions, TransactionResult } from './types';
6
+ import type { TraceData } from './tracer/types';
7
+ import type { AnalysisResult, TraceAndAnalysisResult } from './analyzer/types';
8
+ /**
9
+ * Main SDK class for Tangram Mover
10
+ */
11
+ export declare class TangramMover {
12
+ private suiKit;
13
+ private rpcClient;
14
+ private tracer;
15
+ private analyzer;
16
+ /**
17
+ * Initialize TangramMover with options
18
+ */
19
+ constructor(options?: TangramMoverOptions);
20
+ /**
21
+ * Get the current address
22
+ */
23
+ getCurrentAddress(): string;
24
+ /**
25
+ * Get address for a specific account index (HD wallet)
26
+ */
27
+ getAddress(options?: {
28
+ accountIndex?: number;
29
+ }): string;
30
+ /**
31
+ * Trace a single transaction
32
+ */
33
+ traceTransaction(digest: string): Promise<TraceData>;
34
+ /**
35
+ * Trace multiple transactions
36
+ */
37
+ traceTransactions(digests: string[]): Promise<TraceData[]>;
38
+ /**
39
+ * Analyze a single transaction
40
+ */
41
+ analyzeTransaction(digest: string): Promise<AnalysisResult>;
42
+ /**
43
+ * Analyze multiple transactions
44
+ */
45
+ analyzeTransactions(digests: string[]): Promise<AnalysisResult[]>;
46
+ /**
47
+ * Trace and analyze a transaction in one call
48
+ */
49
+ traceAndAnalyze(digest: string): Promise<TraceAndAnalysisResult>;
50
+ /**
51
+ * Transfer SUI to a recipient
52
+ */
53
+ transferSui(recipient: string, amount: number, options?: {
54
+ accountIndex?: number;
55
+ }): Promise<TransactionResult>;
56
+ /**
57
+ * Transfer SUI to multiple recipients
58
+ */
59
+ transferSuiToMany(recipients: string[], amounts: number[], options?: {
60
+ accountIndex?: number;
61
+ }): Promise<TransactionResult>;
62
+ /**
63
+ * Transfer custom coin to a recipient
64
+ */
65
+ transferCoin(recipient: string, amount: number, coinType: string, options?: {
66
+ accountIndex?: number;
67
+ }): Promise<TransactionResult>;
68
+ /**
69
+ * Transfer custom coin to multiple recipients
70
+ */
71
+ transferCoinToMany(recipients: string[], amounts: number[], coinType: string, options?: {
72
+ accountIndex?: number;
73
+ }): Promise<TransactionResult>;
74
+ /**
75
+ * Call a Move function
76
+ */
77
+ moveCall(target: string, args: any[], typeArguments?: string[], options?: {
78
+ accountIndex?: number;
79
+ }): Promise<TransactionResult>;
80
+ /**
81
+ * Transfer objects
82
+ */
83
+ transferObjects(objectIds: string[], recipient: string, options?: {
84
+ accountIndex?: number;
85
+ }): Promise<TransactionResult>;
86
+ /**
87
+ * Get balance for a coin type
88
+ */
89
+ getBalance(coinType?: string, options?: {
90
+ accountIndex?: number;
91
+ }): Promise<{
92
+ totalBalance: string;
93
+ }>;
94
+ }
95
+ //# sourceMappingURL=tangram-mover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tangram-mover.d.ts","sourceRoot":"","sources":["../../src/tangram-mover.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/E;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAW;IAE3B;;OAEG;gBACS,OAAO,GAAE,mBAAwB;IAiC7C;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAIvD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAI1D;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAIhE;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKjE;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAKvE;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAUtE;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EAAE,EACX,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IA2B7B;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,UAAU,CACd,QAAQ,GAAE,MAAwB,EAClC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAMrC"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Main TangramMover SDK class
4
+ * Integrates transaction tracing, invariant analysis, and transaction execution
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TangramMover = void 0;
8
+ const sui_kit_1 = require("@scallop-io/sui-kit");
9
+ const rpc_client_1 = require("./utils/rpc-client");
10
+ const tracer_1 = require("./tracer/tracer");
11
+ const analyzer_1 = require("./analyzer/analyzer");
12
+ /**
13
+ * Main SDK class for Tangram Mover
14
+ */
15
+ class TangramMover {
16
+ /**
17
+ * Initialize TangramMover with options
18
+ */
19
+ constructor(options = {}) {
20
+ // Initialize SuiKit
21
+ const suiKitOptions = {};
22
+ if (options.secretKey) {
23
+ suiKitOptions.secretKey = options.secretKey;
24
+ }
25
+ else if (options.mnemonics) {
26
+ suiKitOptions.mnemonics = options.mnemonics;
27
+ }
28
+ if (options.networkType) {
29
+ suiKitOptions.networkType = options.networkType;
30
+ }
31
+ if (options.fullnodeUrls) {
32
+ suiKitOptions.fullnodeUrls = options.fullnodeUrls;
33
+ }
34
+ if (options.faucetUrl) {
35
+ suiKitOptions.faucetUrl = options.faucetUrl;
36
+ }
37
+ this.suiKit = new sui_kit_1.SuiKit(suiKitOptions);
38
+ // Initialize RPC client with rate limiting
39
+ const rateLimitMs = options.rateLimitMs || 1000;
40
+ this.rpcClient = new rpc_client_1.RpcClient(this.suiKit, rateLimitMs);
41
+ // Initialize tracer and analyzer
42
+ this.tracer = new tracer_1.Tracer(this.rpcClient);
43
+ this.analyzer = new analyzer_1.Analyzer();
44
+ }
45
+ /**
46
+ * Get the current address
47
+ */
48
+ getCurrentAddress() {
49
+ return this.suiKit.currentAddress;
50
+ }
51
+ /**
52
+ * Get address for a specific account index (HD wallet)
53
+ */
54
+ getAddress(options) {
55
+ return this.suiKit.getAddress(options);
56
+ }
57
+ /**
58
+ * Trace a single transaction
59
+ */
60
+ async traceTransaction(digest) {
61
+ return this.tracer.fetchTrace(digest);
62
+ }
63
+ /**
64
+ * Trace multiple transactions
65
+ */
66
+ async traceTransactions(digests) {
67
+ return this.tracer.fetchTraces(digests);
68
+ }
69
+ /**
70
+ * Analyze a single transaction
71
+ */
72
+ async analyzeTransaction(digest) {
73
+ const traceData = await this.traceTransaction(digest);
74
+ return this.analyzer.analyze(traceData);
75
+ }
76
+ /**
77
+ * Analyze multiple transactions
78
+ */
79
+ async analyzeTransactions(digests) {
80
+ const traceDataArray = await this.traceTransactions(digests);
81
+ return this.analyzer.analyzeMultiple(traceDataArray);
82
+ }
83
+ /**
84
+ * Trace and analyze a transaction in one call
85
+ */
86
+ async traceAndAnalyze(digest) {
87
+ const traceData = await this.traceTransaction(digest);
88
+ const analysis = await this.analyzer.analyze(traceData);
89
+ return {
90
+ trace: traceData,
91
+ analysis,
92
+ };
93
+ }
94
+ /**
95
+ * Transfer SUI to a recipient
96
+ */
97
+ async transferSui(recipient, amount, options) {
98
+ try {
99
+ const result = await this.suiKit.transferSui(recipient, amount, options);
100
+ return {
101
+ digest: result.digest || '',
102
+ status: 'success',
103
+ gasUsed: result.effects?.gasUsed ? {
104
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
105
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
106
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
107
+ } : undefined,
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ digest: '',
113
+ status: 'failure',
114
+ error: error.message || 'Unknown error',
115
+ };
116
+ }
117
+ }
118
+ /**
119
+ * Transfer SUI to multiple recipients
120
+ */
121
+ async transferSuiToMany(recipients, amounts, options) {
122
+ try {
123
+ const result = await this.suiKit.transferSuiToMany(recipients, amounts, options);
124
+ return {
125
+ digest: result.digest || '',
126
+ status: 'success',
127
+ gasUsed: result.effects?.gasUsed ? {
128
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
129
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
130
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
131
+ } : undefined,
132
+ };
133
+ }
134
+ catch (error) {
135
+ return {
136
+ digest: '',
137
+ status: 'failure',
138
+ error: error.message || 'Unknown error',
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Transfer custom coin to a recipient
144
+ */
145
+ async transferCoin(recipient, amount, coinType, options) {
146
+ try {
147
+ const result = await this.suiKit.transferCoin(recipient, amount, coinType, options);
148
+ return {
149
+ digest: result.digest || '',
150
+ status: 'success',
151
+ gasUsed: result.effects?.gasUsed ? {
152
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
153
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
154
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
155
+ } : undefined,
156
+ };
157
+ }
158
+ catch (error) {
159
+ return {
160
+ digest: '',
161
+ status: 'failure',
162
+ error: error.message || 'Unknown error',
163
+ };
164
+ }
165
+ }
166
+ /**
167
+ * Transfer custom coin to multiple recipients
168
+ */
169
+ async transferCoinToMany(recipients, amounts, coinType, options) {
170
+ try {
171
+ const result = await this.suiKit.transferCoinToMany(recipients, amounts, coinType, options);
172
+ return {
173
+ digest: result.digest || '',
174
+ status: 'success',
175
+ gasUsed: result.effects?.gasUsed ? {
176
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
177
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
178
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
179
+ } : undefined,
180
+ };
181
+ }
182
+ catch (error) {
183
+ return {
184
+ digest: '',
185
+ status: 'failure',
186
+ error: error.message || 'Unknown error',
187
+ };
188
+ }
189
+ }
190
+ /**
191
+ * Call a Move function
192
+ */
193
+ async moveCall(target, args, typeArguments, options) {
194
+ try {
195
+ const result = await this.suiKit.moveCall({
196
+ target,
197
+ arguments: args,
198
+ typeArguments: typeArguments || [],
199
+ ...options,
200
+ });
201
+ return {
202
+ digest: result.digest || '',
203
+ status: 'success',
204
+ gasUsed: result.effects?.gasUsed ? {
205
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
206
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
207
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
208
+ } : undefined,
209
+ };
210
+ }
211
+ catch (error) {
212
+ return {
213
+ digest: '',
214
+ status: 'failure',
215
+ error: error.message || 'Unknown error',
216
+ };
217
+ }
218
+ }
219
+ /**
220
+ * Transfer objects
221
+ */
222
+ async transferObjects(objectIds, recipient, options) {
223
+ try {
224
+ const result = await this.suiKit.transferObjects(objectIds, recipient, options);
225
+ return {
226
+ digest: result.digest || '',
227
+ status: 'success',
228
+ gasUsed: result.effects?.gasUsed ? {
229
+ computationCost: parseInt(result.effects.gasUsed.computationCost) || 0,
230
+ storageCost: parseInt(result.effects.gasUsed.storageCost) || 0,
231
+ storageRebate: parseInt(result.effects.gasUsed.storageRebate) || 0,
232
+ } : undefined,
233
+ };
234
+ }
235
+ catch (error) {
236
+ return {
237
+ digest: '',
238
+ status: 'failure',
239
+ error: error.message || 'Unknown error',
240
+ };
241
+ }
242
+ }
243
+ /**
244
+ * Get balance for a coin type
245
+ */
246
+ async getBalance(coinType = '0x2::sui::SUI', options) {
247
+ const result = await this.suiKit.getBalance(coinType, options);
248
+ return {
249
+ totalBalance: result.totalBalance.toString(),
250
+ };
251
+ }
252
+ }
253
+ exports.TangramMover = TangramMover;
254
+ //# sourceMappingURL=tangram-mover.js.map