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.
@@ -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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"}
@@ -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
- export { TreeSnapshot, EntityInfo, FlowOperation, PlainRelationshipMap, AccountUpdateRelationship, TreeOperation, ContractAnalysis, ChangeLog, ContractMethod, MethodAccountUpdate, AUMetadata, Edge, TransactionNode, TransactionState, AccountType, ContractMetadata, MethodAnalysis, EnhancedTransactionState, ParsedAccountUpdate };
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
  }