@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
|
@@ -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
|