autrace 0.0.5 → 0.0.6
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 +10 -0
- package/build/src/AccountUpdateAnalyzer.d.ts +5 -0
- package/build/src/AccountUpdateAnalyzer.js +87 -5
- package/build/src/AccountUpdateAnalyzer.js.map +1 -1
- package/build/src/BlockchainAdapter.d.ts +1 -0
- package/build/src/BlockchainAdapter.js +184 -0
- package/build/src/BlockchainAdapter.js.map +1 -0
- package/build/src/BlockchainFlowAnalyzer.d.ts +17 -0
- package/build/src/BlockchainFlowAnalyzer.js +284 -0
- package/build/src/BlockchainFlowAnalyzer.js.map +1 -0
- package/build/src/Interface.d.ts +67 -1
- package/build/src/Visualiser.d.ts +14 -0
- package/build/src/Visualiser.js +464 -0
- package/build/src/Visualiser.js.map +1 -1
- package/build/src/aucli.d.ts +2 -0
- package/build/src/aucli.js +98 -0
- package/build/src/aucli.js.map +1 -0
- package/build/src/autrace.d.ts +2 -0
- package/build/src/autrace.js +136 -34
- package/build/src/autrace.js.map +1 -1
- package/build/src/config.d.ts +2 -0
- package/build/src/config.js +5 -0
- package/build/src/config.js.map +1 -0
- package/build/src/helper.d.ts +1 -0
- package/build/src/helper.js +23 -0
- package/build/src/helper.js.map +1 -0
- package/package.json +20 -5
@@ -0,0 +1,284 @@
|
|
1
|
+
export class BlockchainFlowAnalyzer {
|
2
|
+
constructor() {
|
3
|
+
this.analyzeTransactionFlow = (blockchainTx) => {
|
4
|
+
const txMeta = {
|
5
|
+
txHash: blockchainTx.txHash,
|
6
|
+
status: blockchainTx.txStatus,
|
7
|
+
blockHeight: blockchainTx.blockHeight,
|
8
|
+
timestamp: blockchainTx.timestamp,
|
9
|
+
fee: blockchainTx.fee,
|
10
|
+
feePayerAddress: blockchainTx.feePayerAddress,
|
11
|
+
memo: blockchainTx.memo || ''
|
12
|
+
};
|
13
|
+
const accountUpdates = this.processAccountUpdates(blockchainTx.updatedAccounts);
|
14
|
+
this.mapFailureInfo(accountUpdates, blockchainTx.failures);
|
15
|
+
const relationships = [
|
16
|
+
// Various relationship types in order of precedence
|
17
|
+
this.buildCallDepthRelationships(accountUpdates),
|
18
|
+
this.buildStateDepRelationships(accountUpdates),
|
19
|
+
this.buildTokenRelationships(accountUpdates),
|
20
|
+
this.buildFeepayerRelationships(accountUpdates, txMeta.feePayerAddress),
|
21
|
+
this.buildCallDataRelationships(accountUpdates),
|
22
|
+
this.buildTemporalRelationships(accountUpdates)
|
23
|
+
];
|
24
|
+
const edges = this.mergeRelationships(relationships);
|
25
|
+
return {
|
26
|
+
metadata: txMeta,
|
27
|
+
nodes: accountUpdates,
|
28
|
+
edges: edges
|
29
|
+
};
|
30
|
+
};
|
31
|
+
this.processAccountUpdates = (rawAccounts) => {
|
32
|
+
return rawAccounts.map((account, index) => ({
|
33
|
+
id: `au-${index}`,
|
34
|
+
index,
|
35
|
+
address: account.accountAddress,
|
36
|
+
shortAddress: account.accountAddress.substring(0, 12) + '...',
|
37
|
+
isContract: account.isZkappAccount || !!account.update?.verificationKey,
|
38
|
+
callDepth: account.callDepth || 0,
|
39
|
+
tokenId: account.tokenId,
|
40
|
+
tokenSymbol: this.extractTokenSymbol(account),
|
41
|
+
balanceChange: account.totalBalanceChange || 0,
|
42
|
+
failed: false, // Will be updated in mapFailureInfo
|
43
|
+
failureReason: null,
|
44
|
+
stateValues: this.extractStateValues(account.update?.appState),
|
45
|
+
callData: account.callData !== '0' ? account.callData : null,
|
46
|
+
permissions: account.update?.permissions || {}
|
47
|
+
}));
|
48
|
+
};
|
49
|
+
this.mapFailureInfo = (accounts, failures) => {
|
50
|
+
if (!failures || !Array.isArray(failures))
|
51
|
+
return;
|
52
|
+
failures.forEach(failure => {
|
53
|
+
// Adjust for 0-based vs 1-based indexing if needed
|
54
|
+
const accountIndex = failure.index - 1;
|
55
|
+
if (accountIndex >= 0 && accountIndex < accounts.length) {
|
56
|
+
accounts[accountIndex].failed = true;
|
57
|
+
accounts[accountIndex].failureReason = failure.failureReason;
|
58
|
+
}
|
59
|
+
});
|
60
|
+
// Find root cause of failure to highlight it
|
61
|
+
const rootFailure = accounts.find(a => a.failed);
|
62
|
+
if (rootFailure) {
|
63
|
+
rootFailure.isRootFailure = true;
|
64
|
+
}
|
65
|
+
};
|
66
|
+
this.buildCallDepthRelationships = (accounts) => {
|
67
|
+
const relationships = [];
|
68
|
+
// Group accounts by call depth
|
69
|
+
const accountsByDepth = new Map();
|
70
|
+
accounts.forEach(account => {
|
71
|
+
if (!accountsByDepth.has(account.callDepth)) {
|
72
|
+
accountsByDepth.set(account.callDepth, []);
|
73
|
+
}
|
74
|
+
accountsByDepth.get(account.callDepth).push(account);
|
75
|
+
});
|
76
|
+
// Process accounts with depth > 0
|
77
|
+
for (let depth = 1; depth <= Math.max(...accountsByDepth.keys()); depth++) {
|
78
|
+
const highDepthAccounts = accountsByDepth.get(depth) || [];
|
79
|
+
const lowerDepthAccounts = accountsByDepth.get(depth - 1) || [];
|
80
|
+
highDepthAccounts.forEach(highAccount => {
|
81
|
+
// Find potential parent account(s) with same address at lower depth
|
82
|
+
const potentialParents = lowerDepthAccounts.filter(lowAccount => lowAccount.address === highAccount.address);
|
83
|
+
if (potentialParents.length > 0) {
|
84
|
+
// Use the closest previous parent in sequence
|
85
|
+
const validParents = potentialParents.filter(p => p.index < highAccount.index);
|
86
|
+
if (validParents.length > 0) {
|
87
|
+
const parent = validParents.reduce((prev, curr) => (curr.index > prev.index) ? curr : prev);
|
88
|
+
relationships.push({
|
89
|
+
from: parent.id,
|
90
|
+
to: highAccount.id,
|
91
|
+
type: 'call_depth',
|
92
|
+
label: 'calls (depth)',
|
93
|
+
color: 'blue'
|
94
|
+
});
|
95
|
+
}
|
96
|
+
}
|
97
|
+
});
|
98
|
+
}
|
99
|
+
return relationships;
|
100
|
+
};
|
101
|
+
this.buildStateDepRelationships = (accounts) => {
|
102
|
+
const relationships = [];
|
103
|
+
const stateValues = new Map();
|
104
|
+
// Track all non-zero state values
|
105
|
+
accounts.forEach(account => {
|
106
|
+
if (account.stateValues) {
|
107
|
+
account.stateValues.forEach((value, index) => {
|
108
|
+
if (value && value !== '0') {
|
109
|
+
const valueStr = value.toString();
|
110
|
+
if (!stateValues.has(valueStr)) {
|
111
|
+
stateValues.set(valueStr, []);
|
112
|
+
}
|
113
|
+
stateValues.get(valueStr).push({ accountId: account.id, index });
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
});
|
118
|
+
// Create relationships for accounts that share state values
|
119
|
+
stateValues.forEach((appearances, value) => {
|
120
|
+
if (appearances.length > 1) {
|
121
|
+
// Sort by account index to get chronological order
|
122
|
+
appearances.sort((a, b) => {
|
123
|
+
const accountA = accounts.find(acc => acc.id === a.accountId);
|
124
|
+
const accountB = accounts.find(acc => acc.id === b.accountId);
|
125
|
+
return accountA.index - accountB.index;
|
126
|
+
});
|
127
|
+
// Create edges between consecutive appearances
|
128
|
+
for (let i = 0; i < appearances.length - 1; i++) {
|
129
|
+
relationships.push({
|
130
|
+
from: appearances[i].accountId,
|
131
|
+
to: appearances[i + 1].accountId,
|
132
|
+
type: 'state_dependency',
|
133
|
+
label: 'state dep',
|
134
|
+
color: 'black'
|
135
|
+
});
|
136
|
+
}
|
137
|
+
}
|
138
|
+
});
|
139
|
+
return relationships;
|
140
|
+
};
|
141
|
+
this.buildTokenRelationships = (accounts) => {
|
142
|
+
const relationships = [];
|
143
|
+
const defaultTokenId = 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf'; // Mina default token
|
144
|
+
// Group accounts by token ID
|
145
|
+
const accountsByToken = new Map();
|
146
|
+
accounts.forEach(account => {
|
147
|
+
if (!accountsByToken.has(account.tokenId)) {
|
148
|
+
accountsByToken.set(account.tokenId, []);
|
149
|
+
}
|
150
|
+
accountsByToken.get(account.tokenId).push(account);
|
151
|
+
});
|
152
|
+
// Create relationships for non-default tokens
|
153
|
+
accountsByToken.forEach((tokenAccounts, tokenId) => {
|
154
|
+
if (tokenId !== defaultTokenId && tokenAccounts.length > 1) {
|
155
|
+
// Sort by account index
|
156
|
+
tokenAccounts.sort((a, b) => a.index - b.index);
|
157
|
+
// Create a chain of token operations
|
158
|
+
for (let i = 0; i < tokenAccounts.length - 1; i++) {
|
159
|
+
relationships.push({
|
160
|
+
from: tokenAccounts[i].id,
|
161
|
+
to: tokenAccounts[i + 1].id,
|
162
|
+
type: 'token_operation',
|
163
|
+
label: 'token op',
|
164
|
+
color: 'purple'
|
165
|
+
});
|
166
|
+
}
|
167
|
+
}
|
168
|
+
});
|
169
|
+
return relationships;
|
170
|
+
};
|
171
|
+
this.buildFeepayerRelationships = (accounts, feePayerAddress) => {
|
172
|
+
const relationships = [];
|
173
|
+
const feePayer = accounts.find(account => account.address === feePayerAddress);
|
174
|
+
if (!feePayer)
|
175
|
+
return relationships;
|
176
|
+
// Connect fee payer to the first non-fee-payer account update
|
177
|
+
const firstOp = accounts.find(account => account.address !== feePayerAddress);
|
178
|
+
if (firstOp) {
|
179
|
+
relationships.push({
|
180
|
+
from: feePayer.id,
|
181
|
+
to: firstOp.id,
|
182
|
+
type: 'fee_payer',
|
183
|
+
label: 'initiates',
|
184
|
+
color: 'green'
|
185
|
+
});
|
186
|
+
}
|
187
|
+
return relationships;
|
188
|
+
};
|
189
|
+
this.buildCallDataRelationships = (accounts) => {
|
190
|
+
const relationships = [];
|
191
|
+
accounts.forEach((account, i) => {
|
192
|
+
if (account.callData) {
|
193
|
+
// Connect to next account in sequence as a heuristic
|
194
|
+
// More sophisticated matching could be done based on actual callData analysis
|
195
|
+
if (i < accounts.length - 1) {
|
196
|
+
relationships.push({
|
197
|
+
from: account.id,
|
198
|
+
to: accounts[i + 1].id,
|
199
|
+
type: 'call_data',
|
200
|
+
label: 'calls (data)',
|
201
|
+
color: 'orange'
|
202
|
+
});
|
203
|
+
}
|
204
|
+
}
|
205
|
+
});
|
206
|
+
return relationships;
|
207
|
+
};
|
208
|
+
this.buildTemporalRelationships = (accounts) => {
|
209
|
+
const relationships = [];
|
210
|
+
for (let i = 0; i < accounts.length - 1; i++) {
|
211
|
+
relationships.push({
|
212
|
+
from: accounts[i].id,
|
213
|
+
to: accounts[i + 1].id,
|
214
|
+
type: 'sequence',
|
215
|
+
label: 'sequence',
|
216
|
+
color: 'gray'
|
217
|
+
});
|
218
|
+
}
|
219
|
+
return relationships;
|
220
|
+
};
|
221
|
+
this.mergeRelationships = (relationshipSets) => {
|
222
|
+
const merged = [];
|
223
|
+
const edgeMap = new Map();
|
224
|
+
// Process each set of relationships in priority order
|
225
|
+
relationshipSets.forEach(relationships => {
|
226
|
+
relationships.forEach(rel => {
|
227
|
+
const edgeKey = `${rel.from}-${rel.to}`;
|
228
|
+
if (!edgeMap.has(edgeKey)) {
|
229
|
+
edgeMap.set(edgeKey, true);
|
230
|
+
merged.push(rel);
|
231
|
+
}
|
232
|
+
});
|
233
|
+
});
|
234
|
+
return merged;
|
235
|
+
};
|
236
|
+
this.applyFailureStatus = (relationships, accounts) => {
|
237
|
+
return relationships.map(rel => {
|
238
|
+
const fromAccount = accounts.find(acc => acc.id === rel.from);
|
239
|
+
const toAccount = accounts.find(acc => acc.id === rel.to);
|
240
|
+
if ((fromAccount && fromAccount.failed) || (toAccount && toAccount.failed)) {
|
241
|
+
return {
|
242
|
+
...rel,
|
243
|
+
failed: true,
|
244
|
+
style: 'dashed'
|
245
|
+
};
|
246
|
+
}
|
247
|
+
return rel;
|
248
|
+
});
|
249
|
+
};
|
250
|
+
this.extractTokenSymbol = (account) => {
|
251
|
+
if (account.update?.tokenSymbol) {
|
252
|
+
return account.update.tokenSymbol;
|
253
|
+
}
|
254
|
+
// Default Mina token
|
255
|
+
if (account.tokenId === 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf') {
|
256
|
+
return 'MINA';
|
257
|
+
}
|
258
|
+
return 'Custom';
|
259
|
+
};
|
260
|
+
this.extractStateValues = (appState) => {
|
261
|
+
if (!appState || !Array.isArray(appState)) {
|
262
|
+
return [];
|
263
|
+
}
|
264
|
+
return appState.map(state => state ? state.toString() : '0');
|
265
|
+
};
|
266
|
+
this.enhanceTransactionState = (txState, blockchainTx) => {
|
267
|
+
// Only proceed if this is a blockchain transaction
|
268
|
+
if (!blockchainTx || !blockchainTx.txHash) {
|
269
|
+
return txState; // Return unchanged if not a blockchain transaction
|
270
|
+
}
|
271
|
+
// Generate flow graph
|
272
|
+
const flowGraph = this.analyzeTransactionFlow(blockchainTx);
|
273
|
+
// Create a new transaction state with the original data plus flow graph
|
274
|
+
return {
|
275
|
+
...txState,
|
276
|
+
blockchainData: {
|
277
|
+
...(txState.blockchainData || {}),
|
278
|
+
flowGraph: flowGraph
|
279
|
+
}
|
280
|
+
};
|
281
|
+
};
|
282
|
+
}
|
283
|
+
}
|
284
|
+
//# sourceMappingURL=BlockchainFlowAnalyzer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"BlockchainFlowAnalyzer.js","sourceRoot":"","sources":["../../src/BlockchainFlowAnalyzer.ts"],"names":[],"mappings":"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"}
|
package/build/src/Interface.d.ts
CHANGED
@@ -32,6 +32,11 @@ interface TransactionNode {
|
|
32
32
|
contractType?: string;
|
33
33
|
features?: Record<string, any>;
|
34
34
|
contractMetadata?: ContractMetadata;
|
35
|
+
failed?: boolean;
|
36
|
+
failureReason?: string;
|
37
|
+
tokenId?: string;
|
38
|
+
callDepth?: number;
|
39
|
+
balanceChange?: number;
|
35
40
|
}
|
36
41
|
interface TransactionState {
|
37
42
|
nodes: Map<string, TransactionNode>;
|
@@ -44,6 +49,7 @@ interface TransactionState {
|
|
44
49
|
accountUpdates: number;
|
45
50
|
};
|
46
51
|
relationships: Map<string, AccountUpdateRelationship>;
|
52
|
+
blockchainData?: BlockchainData;
|
47
53
|
}
|
48
54
|
interface Edge {
|
49
55
|
id: string;
|
@@ -59,6 +65,8 @@ interface Edge {
|
|
59
65
|
};
|
60
66
|
fee?: string;
|
61
67
|
};
|
68
|
+
failed?: boolean;
|
69
|
+
failureReason?: string;
|
62
70
|
}
|
63
71
|
interface AUMetadata {
|
64
72
|
id: string;
|
@@ -68,6 +76,9 @@ interface AUMetadata {
|
|
68
76
|
balanceChange: string;
|
69
77
|
methodName?: string;
|
70
78
|
args?: any[];
|
79
|
+
failed?: boolean;
|
80
|
+
tokenId?: string;
|
81
|
+
callDepth?: number;
|
71
82
|
}
|
72
83
|
type AccountType = 'account' | 'contract';
|
73
84
|
interface ContractMetadata {
|
@@ -148,6 +159,9 @@ interface AccountUpdateRelationship {
|
|
148
159
|
field: string;
|
149
160
|
value: any;
|
150
161
|
}[];
|
162
|
+
tokenId?: string;
|
163
|
+
failed?: boolean;
|
164
|
+
failureReason?: string;
|
151
165
|
}
|
152
166
|
interface PlainRelationshipMap {
|
153
167
|
[key: string]: AccountUpdateRelationship;
|
@@ -169,4 +183,56 @@ interface FlowOperation {
|
|
169
183
|
status?: string;
|
170
184
|
parameters?: Record<string, string>;
|
171
185
|
}
|
172
|
-
|
186
|
+
interface BlockchainData {
|
187
|
+
blockHeight?: number;
|
188
|
+
txHash?: string;
|
189
|
+
timestamp?: number;
|
190
|
+
memo?: string;
|
191
|
+
status?: string;
|
192
|
+
failures?: Array<{
|
193
|
+
index: number;
|
194
|
+
failureReason: string;
|
195
|
+
}>;
|
196
|
+
flowGraph?: TransactionFlowGraph;
|
197
|
+
feePayerAddress?: string;
|
198
|
+
}
|
199
|
+
interface ProcessedAccount {
|
200
|
+
id: string;
|
201
|
+
index: number;
|
202
|
+
address: string;
|
203
|
+
shortAddress: string;
|
204
|
+
isContract: boolean;
|
205
|
+
callDepth: number;
|
206
|
+
tokenId: string;
|
207
|
+
tokenSymbol: string;
|
208
|
+
balanceChange: number;
|
209
|
+
failed: boolean;
|
210
|
+
failureReason: string | null;
|
211
|
+
isRootFailure?: boolean;
|
212
|
+
stateValues: string[];
|
213
|
+
callData: string | null;
|
214
|
+
permissions: any;
|
215
|
+
}
|
216
|
+
interface Relationship {
|
217
|
+
from: string;
|
218
|
+
to: string;
|
219
|
+
type: string;
|
220
|
+
label: string;
|
221
|
+
color: string;
|
222
|
+
failed?: boolean;
|
223
|
+
style?: string;
|
224
|
+
}
|
225
|
+
interface TransactionFlowGraph {
|
226
|
+
metadata: {
|
227
|
+
txHash: string;
|
228
|
+
status: string;
|
229
|
+
blockHeight: number;
|
230
|
+
timestamp: number;
|
231
|
+
fee: number;
|
232
|
+
feePayerAddress: string;
|
233
|
+
memo: string;
|
234
|
+
};
|
235
|
+
nodes: ProcessedAccount[];
|
236
|
+
edges: Relationship[];
|
237
|
+
}
|
238
|
+
export { Relationship, ProcessedAccount, TransactionFlowGraph, TreeSnapshot, BlockchainData, EntityInfo, FlowOperation, PlainRelationshipMap, AccountUpdateRelationship, TreeOperation, ContractAnalysis, ChangeLog, ContractMethod, MethodAccountUpdate, AUMetadata, Edge, TransactionNode, TransactionState, AccountType, ContractMetadata, MethodAnalysis, EnhancedTransactionState, ParsedAccountUpdate };
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import { TransactionState } from './Interface.js';
|
1
2
|
export declare class AUVisualizer {
|
2
3
|
private stateHistory;
|
3
4
|
private entities;
|
@@ -23,4 +24,17 @@ export declare class AUVisualizer {
|
|
23
24
|
generateSVG(outputPath?: string): Promise<void>;
|
24
25
|
generatePNG(outputPath?: string): Promise<void>;
|
25
26
|
generateMarkdownFile(outputPath?: string): Promise<void>;
|
27
|
+
private generateBlockchainSection;
|
28
|
+
generateBlockchainMarkdown(txState: TransactionState): string;
|
29
|
+
private buildEdgesIfMissing;
|
30
|
+
private findFeePayer;
|
31
|
+
private groupNodesByToken;
|
32
|
+
private generateBlockchainFlowSVG;
|
33
|
+
private convertSvgToPngWithSharp;
|
34
|
+
generateBlockchainFlowWithPng: (txState: TransactionState, svgPath?: string, pngPath?: string) => Promise<{
|
35
|
+
svgPath: string;
|
36
|
+
pngPath: string;
|
37
|
+
}>;
|
38
|
+
generateBlockchainVisualization(txState: TransactionState, outputFormat?: 'svg' | 'png' | 'md', outputPath?: string): Promise<string>;
|
39
|
+
generateTransactionVisualization: (txState: TransactionState, outputFormat?: "svg" | "png", outputPath?: string) => Promise<void>;
|
26
40
|
}
|