autrace 0.0.2 → 0.0.4
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 +40 -0
- package/build/src/AccountUpdateTrace.d.ts +5 -4
- package/build/src/AccountUpdateTrace.js +148 -154
- package/build/src/AccountUpdateTrace.js.map +1 -1
- package/build/src/AsciiVisualiser.d.ts +4 -1
- package/build/src/AsciiVisualiser.js +93 -39
- package/build/src/AsciiVisualiser.js.map +1 -1
- package/build/src/index.d.ts +3 -1
- package/build/src/index.js +3 -1
- package/build/src/index.js.map +1 -1
- package/package.json +24 -1
package/README.md
CHANGED
@@ -14,6 +14,10 @@ npm install autrace
|
|
14
14
|
- `AUVisualizer`: Generate visual representations of transaction flows in various formats (Markdown, PNG, SVG)
|
15
15
|
-- Transaction state history tracking
|
16
16
|
-- Contract analysis capabilities
|
17
|
+
- `AccountUpdateTrace`: Track and analyze changes in account updates throughout transaction lifecycle
|
18
|
+
- `ASCIIVisualizer`: Generate visual ASCII representations of transaction changes and account update modifications
|
19
|
+
-- Detailed change detection for account updates
|
20
|
+
-- Colorized terminal output for better visibility
|
17
21
|
|
18
22
|
## Usage
|
19
23
|
|
@@ -67,6 +71,42 @@ await visualizer.generatePNG('output.png');
|
|
67
71
|
await visualizer.generateSVG('output.svg');
|
68
72
|
```
|
69
73
|
|
74
|
+
### Debugging
|
75
|
+
|
76
|
+
```typescript
|
77
|
+
// Initialise the AU change detector + ascii visualizer
|
78
|
+
const auTraverse = new trace.AccountUpdateTrace()
|
79
|
+
const asciiVisuals = new trace.ASCIITreeVisualizer()
|
80
|
+
|
81
|
+
// Create and track transaction states
|
82
|
+
const txn = await Mina.transaction(deployerAccount, async () => {
|
83
|
+
// Your transaction logic here
|
84
|
+
});
|
85
|
+
|
86
|
+
// Take snapshots at different stages
|
87
|
+
auTraverse.takeSnapshot(txn, 'deploy');
|
88
|
+
|
89
|
+
// After transaction is proved
|
90
|
+
const txnprove = await txn.prove();
|
91
|
+
auTraverse.takeSnapshot(txnprove, 'prove');
|
92
|
+
|
93
|
+
// After transaction is signed
|
94
|
+
const txnsign = await txn.sign();
|
95
|
+
auTraverse.takeSnapshot(txnsign, 'sign');
|
96
|
+
|
97
|
+
// Get all snapshots
|
98
|
+
const snapshots = auTraverse.getSnapshots();
|
99
|
+
|
100
|
+
// Generate a visual summary of changes
|
101
|
+
const summary = asciiVisuals.visualizeChangeSummary(snapshots);
|
102
|
+
console.log(summary);
|
103
|
+
```
|
104
|
+
|
105
|
+
### Example Output
|
106
|
+
|
107
|
+
The ASCIIVisualizer provides a colorized terminal output that looks like this:
|
108
|
+

|
109
|
+
|
70
110
|
### Important Notes
|
71
111
|
|
72
112
|
- This package uses ES modules. Ensure your project's package.json has `"type": "module"`.
|
@@ -1,16 +1,17 @@
|
|
1
|
-
import {
|
1
|
+
import { AccountUpdate } from 'o1js';
|
2
|
+
import { TreeSnapshot, TreeOperation } from './Interface.js';
|
2
3
|
export declare class AccountUpdateTrace {
|
3
4
|
private snapshots;
|
4
5
|
private currentTree;
|
5
6
|
private getLeafNodeValue;
|
7
|
+
private isLeafNode;
|
6
8
|
private traverseNodesRecursively;
|
9
|
+
private areValuesEqual;
|
7
10
|
private keysUpdated;
|
8
11
|
private deleteFromSet;
|
9
12
|
private keysRemoved;
|
10
13
|
private keysAdded;
|
11
|
-
private getLeafNodeValueRecursive;
|
12
|
-
private traverseFirstLevelNodes;
|
13
14
|
private compareAUTrees;
|
14
|
-
takeSnapshot(transaction:
|
15
|
+
takeSnapshot(transaction: AccountUpdate[], operation: TreeOperation): TreeSnapshot;
|
15
16
|
getSnapshots(): TreeSnapshot[];
|
16
17
|
}
|
@@ -2,212 +2,206 @@ import { PublicKey } from 'o1js';
|
|
2
2
|
export class AccountUpdateTrace {
|
3
3
|
constructor() {
|
4
4
|
this.snapshots = [];
|
5
|
+
this.currentTree = null;
|
5
6
|
this.getLeafNodeValue = (tree, key) => {
|
6
|
-
//console.log(tree)
|
7
7
|
if (typeof tree !== 'object' || tree === null) {
|
8
8
|
return undefined;
|
9
9
|
}
|
10
|
-
|
11
|
-
|
10
|
+
const keyParts = key.split('.');
|
11
|
+
let current = tree;
|
12
|
+
for (const part of keyParts) {
|
13
|
+
if (current && typeof current === 'object' && part in current) {
|
14
|
+
current = current[part];
|
15
|
+
}
|
16
|
+
else {
|
17
|
+
return undefined;
|
18
|
+
}
|
12
19
|
}
|
20
|
+
return current;
|
21
|
+
};
|
22
|
+
this.isLeafNode = (value) => {
|
23
|
+
return value === null ||
|
24
|
+
value === undefined ||
|
25
|
+
typeof value !== 'object' ||
|
26
|
+
value instanceof PublicKey ||
|
27
|
+
Object.keys(value).length === 0;
|
13
28
|
};
|
14
|
-
this.traverseNodesRecursively = (tree) => {
|
29
|
+
this.traverseNodesRecursively = (tree, parentPath = '') => {
|
15
30
|
const keys = new Set();
|
31
|
+
if (typeof tree !== 'object' || tree === null) {
|
32
|
+
return keys;
|
33
|
+
}
|
16
34
|
for (const key in tree) {
|
17
|
-
|
18
|
-
|
19
|
-
const
|
20
|
-
|
21
|
-
keys.add(
|
35
|
+
if (Object.prototype.hasOwnProperty.call(tree, key)) {
|
36
|
+
const currentPath = parentPath ? `${parentPath}.${key}` : key;
|
37
|
+
const value = tree[key];
|
38
|
+
if (this.isLeafNode(value)) {
|
39
|
+
keys.add(currentPath);
|
40
|
+
}
|
41
|
+
else if (typeof value === 'object' && !Array.isArray(value)) {
|
42
|
+
const childKeys = this.traverseNodesRecursively(value, currentPath);
|
43
|
+
for (const childKey of childKeys) {
|
44
|
+
keys.add(childKey);
|
45
|
+
}
|
22
46
|
}
|
23
47
|
}
|
24
48
|
}
|
25
49
|
return keys;
|
26
50
|
};
|
51
|
+
this.areValuesEqual = (a, b) => {
|
52
|
+
// Handle PublicKey comparison
|
53
|
+
if (a instanceof PublicKey && b instanceof PublicKey) {
|
54
|
+
return a.toBase58() === b.toBase58();
|
55
|
+
}
|
56
|
+
// Handle primitive types
|
57
|
+
if (a === b)
|
58
|
+
return true;
|
59
|
+
// Handle null/undefined
|
60
|
+
if (a == null && b == null)
|
61
|
+
return true;
|
62
|
+
if (a == null || b == null)
|
63
|
+
return false;
|
64
|
+
// Handle BigInt
|
65
|
+
if (typeof a === 'bigint' || typeof b === 'bigint') {
|
66
|
+
return BigInt(a) === BigInt(b);
|
67
|
+
}
|
68
|
+
// Handle Date objects
|
69
|
+
if (a instanceof Date && b instanceof Date) {
|
70
|
+
return a.getTime() === b.getTime();
|
71
|
+
}
|
72
|
+
// Handle Arrays
|
73
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
74
|
+
return a.length === b.length &&
|
75
|
+
a.every((val, idx) => this.areValuesEqual(val, b[idx]));
|
76
|
+
}
|
77
|
+
// Handle Objects
|
78
|
+
if (typeof a === 'object' && typeof b === 'object') {
|
79
|
+
const keysA = Object.keys(a);
|
80
|
+
const keysB = Object.keys(b);
|
81
|
+
if (keysA.length !== keysB.length)
|
82
|
+
return false;
|
83
|
+
return keysA.every(key => Object.prototype.hasOwnProperty.call(b, key) &&
|
84
|
+
this.areValuesEqual(a[key], b[key]));
|
85
|
+
}
|
86
|
+
return false;
|
87
|
+
};
|
27
88
|
this.keysUpdated = (a, b, keyList) => {
|
28
89
|
const keysUpdatedList = [];
|
29
90
|
for (const key of keyList) {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
if (oldValue instanceof PublicKey && newValue instanceof PublicKey) {
|
36
|
-
oldValue = oldValue.toBase58();
|
37
|
-
newValue = newValue.toBase58();
|
38
|
-
//console.log('Public key old value: ', oldValue)
|
39
|
-
//console.log('Public key new value: ', newValue)
|
91
|
+
const oldValue = this.getLeafNodeValue(a, key);
|
92
|
+
const newValue = this.getLeafNodeValue(b, key);
|
93
|
+
// Skip if both values are functions or if the values are equal
|
94
|
+
if (typeof oldValue === 'function' || typeof newValue === 'function') {
|
95
|
+
continue;
|
40
96
|
}
|
41
|
-
if (newValue
|
97
|
+
if (!this.areValuesEqual(oldValue, newValue)) {
|
42
98
|
keysUpdatedList.push({
|
43
99
|
field: key,
|
44
|
-
oldValue
|
45
|
-
newValue: newValue
|
100
|
+
oldValue,
|
101
|
+
newValue: newValue === undefined ? null : newValue
|
46
102
|
});
|
47
103
|
}
|
48
104
|
}
|
49
105
|
return keysUpdatedList;
|
50
106
|
};
|
51
107
|
this.deleteFromSet = (set, toDelete) => {
|
108
|
+
const newSet = new Set(set);
|
52
109
|
for (const item of toDelete) {
|
53
|
-
|
110
|
+
newSet.delete(item);
|
54
111
|
}
|
55
|
-
return
|
112
|
+
return newSet;
|
56
113
|
};
|
57
114
|
this.keysRemoved = (a, b) => {
|
58
|
-
|
59
|
-
for (const key of a) {
|
60
|
-
if (!b.has(key)) {
|
61
|
-
keysRemovedList.push(key);
|
62
|
-
}
|
63
|
-
}
|
64
|
-
return keysRemovedList;
|
115
|
+
return Array.from(a).filter(key => !b.has(key));
|
65
116
|
};
|
66
117
|
this.keysAdded = (a, b) => {
|
67
|
-
|
68
|
-
for (const key of b) {
|
69
|
-
if (!a.has(key)) {
|
70
|
-
keysAddedList.push(key);
|
71
|
-
}
|
72
|
-
}
|
73
|
-
return keysAddedList;
|
118
|
+
return Array.from(b).filter(key => !a.has(key));
|
74
119
|
};
|
75
|
-
this.
|
76
|
-
const
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
120
|
+
this.compareAUTrees = (oldAUArray, newAUArray, path = 'accountUpdate') => {
|
121
|
+
const changes = {
|
122
|
+
added: [],
|
123
|
+
removed: [],
|
124
|
+
updated: []
|
125
|
+
};
|
126
|
+
// Handle null cases
|
127
|
+
if (!oldAUArray && !newAUArray)
|
128
|
+
return changes;
|
129
|
+
if (!oldAUArray) {
|
130
|
+
if (newAUArray) {
|
131
|
+
changes.added.push({
|
132
|
+
path,
|
133
|
+
node: newAUArray
|
134
|
+
});
|
84
135
|
}
|
136
|
+
return changes;
|
85
137
|
}
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
};
|
93
|
-
/*private compareTxnTree = (treeA: any, treeB: any): ChangeLog => {
|
94
|
-
const changes: ChangeLog = {
|
95
|
-
added: [], removed: [], updated: []
|
138
|
+
if (!newAUArray) {
|
139
|
+
changes.removed.push({
|
140
|
+
path,
|
141
|
+
node: oldAUArray
|
142
|
+
});
|
143
|
+
return changes;
|
96
144
|
}
|
97
|
-
|
98
|
-
const
|
99
|
-
const
|
100
|
-
|
101
|
-
for ( const key of keysTreeB ) {
|
102
|
-
if ( key === 'accountUpdates') {
|
103
|
-
const oldAUTree = this.getLeafNodeValue(treeA, key)
|
104
|
-
const newAUtree = this.getLeafNodeValue(treeB, key)
|
105
|
-
this.compareAUTrees(oldAUTree, newAUtree)
|
106
|
-
}
|
107
|
-
const oldValue = this.getLeafNodeValue(treeA, key)
|
108
|
-
const newValue = this.getLeafNodeValue(treeB, key)
|
109
|
-
if ( oldValue !== newValue ) {
|
110
|
-
changes.updated.push({
|
111
|
-
path: 'transaction',
|
112
|
-
changes: [{
|
113
|
-
field: key,
|
114
|
-
oldValue: oldValue,
|
115
|
-
newValue: newValue
|
116
|
-
}]
|
117
|
-
})
|
118
|
-
}
|
119
|
-
}
|
120
|
-
return changes
|
121
|
-
}*/
|
122
|
-
this.compareAUTrees = (oldAUArray, newAUArray, path = 'accountUpdate'
|
123
|
-
//path: string = 'transaction'
|
124
|
-
) => {
|
125
|
-
const changes = {
|
126
|
-
added: [], removed: [], updated: []
|
127
|
-
};
|
128
|
-
const validOldAUArray = Array.isArray(oldAUArray) ? oldAUArray : [];
|
129
|
-
const validNewAUArray = Array.isArray(newAUArray) ? newAUArray : [];
|
130
|
-
const oldAUMap = new Map((validOldAUArray || []).map((node) => [node.id, node]));
|
131
|
-
const newAUMap = new Map((validNewAUArray || []).map((node) => [node.id, node]));
|
132
|
-
const compareAUItemsRecursive = (a, b, path) => {
|
145
|
+
const oldAUMap = new Map(oldAUArray.map(node => [node.id, node]));
|
146
|
+
const newAUMap = new Map(newAUArray.map(node => [node.id, node]));
|
147
|
+
const compareAUItemsRecursive = (a, b, currentPath) => {
|
133
148
|
const keysA = this.traverseNodesRecursively(a);
|
134
149
|
const keysB = this.traverseNodesRecursively(b);
|
135
|
-
//
|
136
|
-
|
137
|
-
|
138
|
-
for (const key of keysRemovedList) {
|
139
|
-
const value = this.getLeafNodeValueRecursive(a, key);
|
150
|
+
// Handle removed keys
|
151
|
+
for (const key of this.keysRemoved(keysA, keysB)) {
|
152
|
+
const value = this.getLeafNodeValue(a, key);
|
140
153
|
changes.removed.push({
|
141
|
-
path: `${
|
154
|
+
path: `${currentPath}.${key}`,
|
142
155
|
node: { key, value }
|
143
156
|
});
|
144
157
|
}
|
145
|
-
|
146
|
-
for (const key of
|
147
|
-
let value;
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
if (value.length > 50) {
|
152
|
-
value = `${value.slice(0, 50)}...`;
|
153
|
-
}
|
154
|
-
}
|
155
|
-
else {
|
156
|
-
value = this.getLeafNodeValueRecursive(b, key);
|
158
|
+
// Handle added keys
|
159
|
+
for (const key of this.keysAdded(keysA, keysB)) {
|
160
|
+
let value = this.getLeafNodeValue(b, key);
|
161
|
+
// Truncate long proof values
|
162
|
+
if (key.includes('proof') && typeof value === 'string' && value.length > 50) {
|
163
|
+
value = `${value.slice(0, 50)}...`;
|
157
164
|
}
|
158
165
|
changes.added.push({
|
159
|
-
path: `${
|
166
|
+
path: `${currentPath}.${key}`,
|
160
167
|
node: { key, value }
|
161
168
|
});
|
162
169
|
}
|
163
|
-
|
164
|
-
|
165
|
-
const
|
166
|
-
for (const { field, oldValue, newValue } of
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
path: `${path}.${field}`,
|
176
|
-
changes: [{
|
177
|
-
field,
|
178
|
-
oldValue,
|
179
|
-
newValue: newValue === undefined ? {} : newValue
|
180
|
-
}],
|
181
|
-
});
|
182
|
-
}
|
183
|
-
else {
|
184
|
-
compareAUItemsRecursive(oldValue, newValue, `${path}.${field}`);
|
185
|
-
}
|
170
|
+
// Handle updated keys
|
171
|
+
const commonKeys = new Set([...keysA].filter(x => keysB.has(x)));
|
172
|
+
const updatedKeys = this.keysUpdated(a, b, commonKeys);
|
173
|
+
for (const { field, oldValue, newValue } of updatedKeys) {
|
174
|
+
changes.updated.push({
|
175
|
+
path: `${currentPath}.${field}`,
|
176
|
+
changes: [{
|
177
|
+
field,
|
178
|
+
oldValue,
|
179
|
+
newValue
|
180
|
+
}]
|
181
|
+
});
|
186
182
|
}
|
187
183
|
};
|
188
|
-
//
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
//compareAUItems(oldAUArrayItem, newAUArrayItem, currentPath)
|
201
|
-
compareAUItemsRecursive(oldAUArrayItem, newAUArrayItem, currentPath);
|
202
|
-
}
|
184
|
+
// Compare existing nodes
|
185
|
+
for (const oldAU of oldAUArray) {
|
186
|
+
const currentPath = `${path}[${oldAUArray.indexOf(oldAU)}]`;
|
187
|
+
if (!newAUMap.has(oldAU.id)) {
|
188
|
+
changes.removed.push({
|
189
|
+
path: currentPath,
|
190
|
+
node: oldAU
|
191
|
+
});
|
192
|
+
}
|
193
|
+
else {
|
194
|
+
const newAU = newAUMap.get(oldAU.id);
|
195
|
+
compareAUItemsRecursive(oldAU, newAU, currentPath);
|
203
196
|
}
|
204
197
|
}
|
205
|
-
|
206
|
-
|
207
|
-
if (!oldAUMap.has(
|
198
|
+
// Handle new nodes
|
199
|
+
for (const newAU of newAUArray) {
|
200
|
+
if (!oldAUMap.has(newAU.id)) {
|
201
|
+
const currentPath = `${path}[${newAUArray.indexOf(newAU)}]`;
|
208
202
|
changes.added.push({
|
209
203
|
path: currentPath,
|
210
|
-
node:
|
204
|
+
node: newAU
|
211
205
|
});
|
212
206
|
}
|
213
207
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountUpdateTrace.js","sourceRoot":"","sources":["../../src/AccountUpdateTrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAc,MAAM,MAAM,CAAC;AAG5D,MAAM,OAAO,kBAAkB;IAA/B;QACY,cAAS,GAAmB,EAAE,CAAC;
|
1
|
+
{"version":3,"file":"AccountUpdateTrace.js","sourceRoot":"","sources":["../../src/AccountUpdateTrace.ts"],"names":[],"mappings":"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"}
|
@@ -1,9 +1,12 @@
|
|
1
|
-
import { TreeSnapshot } from "./Interface";
|
1
|
+
import { TreeSnapshot } from "./Interface.js";
|
2
2
|
export declare class ASCIITreeVisualizer {
|
3
3
|
private readonly INDENT;
|
4
|
+
private readonly TRUNCATE_LENGTH;
|
5
|
+
private readonly HASH_PREVIEW_LENGTH;
|
4
6
|
private readonly COLORS;
|
5
7
|
private readonly SYMBOLS;
|
6
8
|
private formatValue;
|
9
|
+
private truncateString;
|
7
10
|
private stringifyWithBigInt;
|
8
11
|
private visualizeChanges;
|
9
12
|
visualizeChangeSummary(snapshots: TreeSnapshot[]): string;
|
@@ -1,6 +1,8 @@
|
|
1
1
|
export class ASCIITreeVisualizer {
|
2
2
|
constructor() {
|
3
3
|
this.INDENT = ' ';
|
4
|
+
this.TRUNCATE_LENGTH = 50;
|
5
|
+
this.HASH_PREVIEW_LENGTH = 8;
|
4
6
|
this.COLORS = {
|
5
7
|
reset: '\x1b[0m',
|
6
8
|
green: '\x1b[32m',
|
@@ -23,90 +25,137 @@ export class ASCIITreeVisualizer {
|
|
23
25
|
vertical: '│',
|
24
26
|
};
|
25
27
|
this.stringifyWithBigInt = (obj) => {
|
26
|
-
|
28
|
+
try {
|
29
|
+
return JSON.stringify(obj, (key, value) => {
|
30
|
+
if (typeof value === 'bigint') {
|
31
|
+
return value.toString();
|
32
|
+
}
|
33
|
+
if (value instanceof Error) {
|
34
|
+
return value.message;
|
35
|
+
}
|
36
|
+
return value;
|
37
|
+
});
|
38
|
+
}
|
39
|
+
catch (error) {
|
40
|
+
return '[Error: Unable to stringify]';
|
41
|
+
}
|
27
42
|
};
|
28
43
|
}
|
29
44
|
formatValue(value) {
|
30
|
-
if (value === null || value === undefined)
|
45
|
+
if (value === null || value === undefined) {
|
31
46
|
return 'null';
|
47
|
+
}
|
32
48
|
if (Array.isArray(value)) {
|
33
|
-
|
49
|
+
try {
|
50
|
+
return `[${value.map(v => this.formatValue(v)).join(', ')}]`;
|
51
|
+
}
|
52
|
+
catch (error) {
|
53
|
+
return '[Error: Invalid Array]';
|
54
|
+
}
|
34
55
|
}
|
35
56
|
if (typeof value === 'object') {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
57
|
+
try {
|
58
|
+
if (value === null) {
|
59
|
+
return 'null';
|
60
|
+
}
|
61
|
+
if ('_value' in value) {
|
62
|
+
return String(value._value);
|
63
|
+
}
|
64
|
+
// Handle special cases
|
65
|
+
if (value.hash) {
|
66
|
+
return `{hash: "${value.hash.substring(0, this.HASH_PREVIEW_LENGTH)}..."}`;
|
67
|
+
}
|
68
|
+
const str = this.stringifyWithBigInt(value);
|
69
|
+
return this.truncateString(str);
|
42
70
|
}
|
43
|
-
|
44
|
-
|
45
|
-
return `${str.substring(0, 47)}...`;
|
71
|
+
catch (error) {
|
72
|
+
return '[Error: Invalid Object]';
|
46
73
|
}
|
74
|
+
}
|
75
|
+
try {
|
76
|
+
const str = String(value);
|
77
|
+
return this.truncateString(str);
|
78
|
+
}
|
79
|
+
catch (error) {
|
80
|
+
return '[Error: Invalid Value]';
|
81
|
+
}
|
82
|
+
}
|
83
|
+
truncateString(str) {
|
84
|
+
if (str.length <= this.TRUNCATE_LENGTH) {
|
47
85
|
return str;
|
48
86
|
}
|
49
|
-
|
50
|
-
|
51
|
-
if (str.startsWith('B62')) {
|
52
|
-
return `${str.substring(0, 8)}...`;
|
53
|
-
}
|
54
|
-
return `${str.substring(0, 47)}...`;
|
87
|
+
if (str.startsWith('B62')) {
|
88
|
+
return `${str.substring(0, this.HASH_PREVIEW_LENGTH)}...`;
|
55
89
|
}
|
56
|
-
return str
|
90
|
+
return `${str.substring(0, this.TRUNCATE_LENGTH - 3)}...`;
|
57
91
|
}
|
58
92
|
visualizeChanges(changes) {
|
59
93
|
let result = '';
|
60
|
-
|
94
|
+
const hasAdded = Array.isArray(changes.added) && changes.added.length > 0;
|
95
|
+
const hasUpdated = Array.isArray(changes.updated) && changes.updated.length > 0;
|
96
|
+
const hasRemoved = Array.isArray(changes.removed) && changes.removed.length > 0;
|
97
|
+
if (hasAdded) {
|
61
98
|
result += `${this.COLORS.green}${this.SYMBOLS.branch} Added:${this.COLORS.reset}\n`;
|
62
99
|
changes.added.forEach((item, i) => {
|
63
100
|
const isLast = i === changes.added.length - 1;
|
64
101
|
const prefix = isLast ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
65
102
|
result += `${this.COLORS.green}${prefix} ${this.SYMBOLS.added} ${item.path}${this.COLORS.reset}\n`;
|
66
|
-
|
67
|
-
|
103
|
+
if (item.node) {
|
104
|
+
const addPrefix = isLast ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
105
|
+
result += `${this.COLORS.green} ${addPrefix} ${this.stringifyWithBigInt(item.node)} ${this.COLORS.reset}\n`;
|
106
|
+
}
|
68
107
|
});
|
69
108
|
}
|
70
|
-
if (
|
71
|
-
if (
|
109
|
+
if (hasUpdated) {
|
110
|
+
if (hasAdded)
|
72
111
|
result += '\n';
|
73
112
|
result += `${this.COLORS.yellow}${this.SYMBOLS.branch} Modified:${this.COLORS.reset}\n`;
|
74
113
|
changes.updated.forEach((mod, i) => {
|
75
114
|
const isLast = i === changes.updated.length - 1;
|
76
115
|
const prefix = isLast ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
77
116
|
result += `${this.COLORS.yellow}${prefix} ${this.SYMBOLS.modified} ${mod.path}${this.COLORS.reset}\n`;
|
78
|
-
mod.changes
|
79
|
-
|
80
|
-
|
81
|
-
`${this.
|
82
|
-
|
117
|
+
if (Array.isArray(mod.changes)) {
|
118
|
+
mod.changes.forEach((change, j) => {
|
119
|
+
const changePrefix = j === mod.changes.length - 1 ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
120
|
+
result += `${this.COLORS.gray} ${changePrefix} ${change.field}: ${this.COLORS.reset}` +
|
121
|
+
`${this.formatValue(change.oldValue)} ${this.SYMBOLS.arrow} ${this.formatValue(change.newValue)}\n`;
|
122
|
+
});
|
123
|
+
}
|
83
124
|
});
|
84
125
|
}
|
85
|
-
if (
|
86
|
-
if (
|
126
|
+
if (hasRemoved) {
|
127
|
+
if (hasAdded || hasUpdated)
|
87
128
|
result += '\n';
|
88
129
|
result += `${this.COLORS.red}${this.SYMBOLS.branch} Removed:${this.COLORS.reset}\n`;
|
89
130
|
changes.removed.forEach((item, i) => {
|
90
131
|
const isLast = i === changes.removed.length - 1;
|
91
132
|
const prefix = isLast ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
92
133
|
result += `${this.COLORS.red}${prefix} ${this.SYMBOLS.removed} ${item.path}${this.COLORS.reset}\n`;
|
93
|
-
|
94
|
-
|
95
|
-
|
134
|
+
if (item.node) {
|
135
|
+
const removePrefix = isLast ? this.SYMBOLS.leaf : this.SYMBOLS.branch;
|
136
|
+
result += `${this.COLORS.red} ${removePrefix} ${this.stringifyWithBigInt(item.node)} ${this.COLORS.reset}\n`;
|
137
|
+
}
|
96
138
|
});
|
97
139
|
}
|
98
140
|
return result;
|
99
141
|
}
|
100
142
|
visualizeChangeSummary(snapshots) {
|
143
|
+
if (!Array.isArray(snapshots) || snapshots.length === 0) {
|
144
|
+
return this.formatHeader('No changes to visualize');
|
145
|
+
}
|
101
146
|
let result = this.formatHeader('Transaction Evolution Summary');
|
102
147
|
snapshots.forEach((snapshot, index) => {
|
103
|
-
|
148
|
+
if (!snapshot)
|
149
|
+
return;
|
150
|
+
const timestamp = snapshot.timestamp || Date.now();
|
151
|
+
const operation = snapshot.operation || 'UNKNOWN';
|
152
|
+
result += this.formatPhase(operation, timestamp);
|
104
153
|
if (index === 0) {
|
105
154
|
const accountUpdates = Array.isArray(snapshot.tree) ? snapshot.tree.length : 0;
|
106
155
|
result += `${this.COLORS.gray}${this.SYMBOLS.bullet} Created transaction with ${accountUpdates} account updates${this.COLORS.reset}\n`;
|
107
156
|
}
|
108
|
-
else {
|
109
|
-
const hasChanges = Object.values(snapshot.changes).some(arr => arr.length > 0);
|
157
|
+
else if (snapshot.changes) {
|
158
|
+
const hasChanges = Object.values(snapshot.changes).some(arr => Array.isArray(arr) && arr.length > 0);
|
110
159
|
if (hasChanges) {
|
111
160
|
result += this.visualizeChanges(snapshot.changes);
|
112
161
|
}
|
@@ -123,8 +172,13 @@ export class ASCIITreeVisualizer {
|
|
123
172
|
return `${this.COLORS.blue}╔${line}╗\n║ ${text} ║\n╚${line}╝${this.COLORS.reset}\n`;
|
124
173
|
}
|
125
174
|
formatPhase(phase, timestamp) {
|
126
|
-
|
127
|
-
|
175
|
+
try {
|
176
|
+
const date = new Date(timestamp).toLocaleTimeString();
|
177
|
+
return `${this.COLORS.bold}${this.COLORS.purple}▶ ${phase.toUpperCase()} ${this.COLORS.gray}(${date})${this.COLORS.reset}\n`;
|
178
|
+
}
|
179
|
+
catch (error) {
|
180
|
+
return `${this.COLORS.bold}${this.COLORS.purple}▶ ${phase.toUpperCase()} ${this.COLORS.gray}(Invalid timestamp)${this.COLORS.reset}\n`;
|
181
|
+
}
|
128
182
|
}
|
129
183
|
}
|
130
184
|
//# sourceMappingURL=AsciiVisualiser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AsciiVisualiser.js","sourceRoot":"","sources":["../../src/AsciiVisualiser.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"AsciiVisualiser.js","sourceRoot":"","sources":["../../src/AsciiVisualiser.ts"],"names":[],"mappings":"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"}
|
package/build/src/index.d.ts
CHANGED
@@ -1,3 +1,5 @@
|
|
1
1
|
import { AUTrace } from "./autrace.js";
|
2
2
|
import { AUVisualizer } from "./Visualiser.js";
|
3
|
-
|
3
|
+
import { AccountUpdateTrace } from "./AccountUpdateTrace.js";
|
4
|
+
import { ASCIITreeVisualizer } from "./AsciiVisualiser.js";
|
5
|
+
export { AUTrace, AUVisualizer, AccountUpdateTrace, ASCIITreeVisualizer };
|
package/build/src/index.js
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
import { AUTrace } from "./autrace.js";
|
2
2
|
import { AUVisualizer } from "./Visualiser.js";
|
3
|
-
|
3
|
+
import { AccountUpdateTrace } from "./AccountUpdateTrace.js";
|
4
|
+
import { ASCIITreeVisualizer } from "./AsciiVisualiser.js";
|
5
|
+
export { AUTrace, AUVisualizer, AccountUpdateTrace, ASCIITreeVisualizer };
|
4
6
|
//# sourceMappingURL=index.js.map
|
package/build/src/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAC,CAAA"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "autrace",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.4",
|
4
4
|
"description": "Account Update analyser for MINA",
|
5
5
|
"main": "build/src/index.js",
|
6
6
|
"types": "build/src/index.d.ts",
|
@@ -10,6 +10,29 @@
|
|
10
10
|
"LICENSE"
|
11
11
|
],
|
12
12
|
"type": "module",
|
13
|
+
"repository": {
|
14
|
+
"type": "git",
|
15
|
+
"url": "git+https://github.com/ronykris/mina-account-update.git"
|
16
|
+
},
|
17
|
+
"keywords": [
|
18
|
+
"mina-protocol",
|
19
|
+
"o1js",
|
20
|
+
"zkapp",
|
21
|
+
"blockchain",
|
22
|
+
"transaction-tracing",
|
23
|
+
"account-updates",
|
24
|
+
"visualization",
|
25
|
+
"debugging",
|
26
|
+
"development-tools",
|
27
|
+
"smart-contracts",
|
28
|
+
"zkapp-development",
|
29
|
+
"mina-debugging",
|
30
|
+
"transaction-visualization",
|
31
|
+
"blockchain-analysis",
|
32
|
+
"developer-tools",
|
33
|
+
"zero-knowledge",
|
34
|
+
"zk-tools"
|
35
|
+
],
|
13
36
|
"scripts": {
|
14
37
|
"test": "echo \"Error: no test specified\" && exit 1",
|
15
38
|
"build": "tsc"
|