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
package/README.md
CHANGED
@@ -102,6 +102,16 @@ const summary = asciiVisuals.visualizeChangeSummary(snapshots);
|
|
102
102
|
console.log(summary);
|
103
103
|
```
|
104
104
|
|
105
|
+
### Visualising onchain transactions
|
106
|
+
|
107
|
+
Visualize any zkapp transaction from the chain like so
|
108
|
+
|
109
|
+
```bash
|
110
|
+
BLOCKBERRY_API_KEY=your_api_key npx aucli --tx 5JttgfFUzZXfYYksdbZHms7eDvqwvzvf65GuirsAcNaZpFC5BC5z
|
111
|
+
```
|
112
|
+
This will generate a `transaction_visualization.png` with the visulaisation.
|
113
|
+
|
114
|
+
|
105
115
|
### Important Notes
|
106
116
|
|
107
117
|
- This package uses ES modules. Ensure your project's package.json has `"type": "module"`.
|
@@ -4,14 +4,19 @@ export declare class AccountUpdateAnalyzer {
|
|
4
4
|
private auRelationships;
|
5
5
|
private currentDepth;
|
6
6
|
private parentStack;
|
7
|
+
private tokenMap;
|
7
8
|
constructor();
|
9
|
+
reset(): void;
|
8
10
|
processAccountUpdate(au: AccountUpdate): void;
|
9
11
|
private extractMethodInfo;
|
10
12
|
private extractStateChanges;
|
13
|
+
private processTokenRelationships;
|
11
14
|
getRelationships(): Map<string, AccountUpdateRelationship>;
|
12
15
|
getHierarchicalView(): {
|
13
16
|
id: string;
|
14
17
|
label: string;
|
15
18
|
children: any[];
|
19
|
+
tokenId?: string;
|
20
|
+
failed?: boolean;
|
16
21
|
}[];
|
17
22
|
}
|
@@ -2,11 +2,34 @@ export class AccountUpdateAnalyzer {
|
|
2
2
|
constructor() {
|
3
3
|
this.currentDepth = 0;
|
4
4
|
this.parentStack = []; // Stack to track parent AUs
|
5
|
+
this.tokenMap = new Map();
|
5
6
|
this.auRelationships = new Map();
|
7
|
+
this.tokenMap = new Map();
|
8
|
+
}
|
9
|
+
reset() {
|
10
|
+
this.auRelationships = new Map();
|
11
|
+
this.currentDepth = 0;
|
12
|
+
this.parentStack = [];
|
13
|
+
this.tokenMap = new Map();
|
6
14
|
}
|
7
15
|
processAccountUpdate(au) {
|
8
16
|
const auId = au.id.toString();
|
9
|
-
const callDepth = au.body.callDepth || 0;
|
17
|
+
//const callDepth = au.body.callDepth || 0;
|
18
|
+
let callDepth = 0;
|
19
|
+
if (au.metadata?.callDepth !== undefined) {
|
20
|
+
callDepth = au.metadata.callDepth;
|
21
|
+
}
|
22
|
+
else if (au.body.callDepth !== undefined) {
|
23
|
+
callDepth = au.body.callDepth;
|
24
|
+
}
|
25
|
+
// Extract failure information if present
|
26
|
+
const failed = au.metadata?.failed || false;
|
27
|
+
const failureReason = au.metadata?.failureReason;
|
28
|
+
const tokenId = au.metadata?.tokenId || au.body.tokenId || 'default';
|
29
|
+
if (!this.tokenMap.has(tokenId)) {
|
30
|
+
this.tokenMap.set(tokenId, []);
|
31
|
+
}
|
32
|
+
this.tokenMap.get(tokenId).push(auId);
|
10
33
|
// Manage parent stack based on call depth
|
11
34
|
while (this.currentDepth >= callDepth && this.parentStack.length > 0) {
|
12
35
|
this.parentStack.pop();
|
@@ -14,15 +37,23 @@ export class AccountUpdateAnalyzer {
|
|
14
37
|
}
|
15
38
|
const parentId = this.parentStack.length > 0 ? this.parentStack[this.parentStack.length - 1] : undefined;
|
16
39
|
const methodInfo = this.extractMethodInfo(au);
|
40
|
+
// Get label, handle failure info
|
41
|
+
let label = au.label || 'Unnamed Update';
|
42
|
+
if (failed) {
|
43
|
+
label = `[FAILED] ${label}`;
|
44
|
+
}
|
17
45
|
// Create relationship entry
|
18
46
|
const relationship = {
|
19
47
|
id: auId,
|
20
|
-
label:
|
48
|
+
label: label,
|
21
49
|
parentId,
|
22
50
|
children: [],
|
23
51
|
depth: callDepth,
|
24
52
|
method: this.extractMethodInfo(au),
|
25
|
-
stateChanges: this.extractStateChanges(au)
|
53
|
+
stateChanges: this.extractStateChanges(au),
|
54
|
+
tokenId: tokenId,
|
55
|
+
failed: failed,
|
56
|
+
failureReason: failureReason
|
26
57
|
};
|
27
58
|
// Update parent's children array
|
28
59
|
if (parentId) {
|
@@ -33,10 +64,19 @@ export class AccountUpdateAnalyzer {
|
|
33
64
|
}
|
34
65
|
this.auRelationships.set(auId, relationship);
|
35
66
|
// Update stack for next iterations
|
36
|
-
|
37
|
-
|
67
|
+
if (!failed) { // Only use non-failed operations as potential parents
|
68
|
+
this.parentStack.push(auId);
|
69
|
+
this.currentDepth = callDepth;
|
70
|
+
}
|
38
71
|
}
|
39
72
|
extractMethodInfo(au) {
|
73
|
+
// First check blockchain format
|
74
|
+
if (au.lazyAuthorization?.methodName) {
|
75
|
+
return {
|
76
|
+
contract: au.label || 'Unknown',
|
77
|
+
name: au.lazyAuthorization.methodName
|
78
|
+
};
|
79
|
+
}
|
40
80
|
if (!au.label)
|
41
81
|
return undefined;
|
42
82
|
const parts = au.label.split('.');
|
@@ -49,6 +89,13 @@ export class AccountUpdateAnalyzer {
|
|
49
89
|
return undefined;
|
50
90
|
}
|
51
91
|
extractStateChanges(au) {
|
92
|
+
// Check blockchain format first
|
93
|
+
if (au.metadata?.stateUpdates) {
|
94
|
+
return au.metadata.stateUpdates.map((update) => ({
|
95
|
+
field: update.type || 'unknown',
|
96
|
+
value: update.value
|
97
|
+
}));
|
98
|
+
}
|
52
99
|
const changes = [];
|
53
100
|
if (au.body?.update?.appState) {
|
54
101
|
au.body.update.appState.forEach((state, index) => {
|
@@ -62,10 +109,42 @@ export class AccountUpdateAnalyzer {
|
|
62
109
|
}
|
63
110
|
return changes.length > 0 ? changes : undefined;
|
64
111
|
}
|
112
|
+
processTokenRelationships() {
|
113
|
+
// For each token, identify operations that should be related
|
114
|
+
for (const [tokenId, operations] of this.tokenMap.entries()) {
|
115
|
+
if (operations.length <= 1)
|
116
|
+
continue;
|
117
|
+
// Find operations without parents that can be related
|
118
|
+
const orphans = operations.filter(id => {
|
119
|
+
const rel = this.auRelationships.get(id);
|
120
|
+
return rel && !rel.parentId && !rel.failed;
|
121
|
+
});
|
122
|
+
if (orphans.length <= 1)
|
123
|
+
continue;
|
124
|
+
// Use first operation as a root for others
|
125
|
+
const rootId = orphans[0];
|
126
|
+
if (!rootId)
|
127
|
+
continue;
|
128
|
+
const rootRel = this.auRelationships.get(rootId);
|
129
|
+
if (!rootRel)
|
130
|
+
continue;
|
131
|
+
// Connect other orphans to the root
|
132
|
+
for (let i = 1; i < orphans.length; i++) {
|
133
|
+
const orphanId = orphans[i];
|
134
|
+
const orphanRel = this.auRelationships.get(orphanId);
|
135
|
+
if (orphanRel && !orphanRel.parentId) {
|
136
|
+
orphanRel.parentId = rootId;
|
137
|
+
rootRel.children.push(orphanId);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
}
|
65
142
|
getRelationships() {
|
143
|
+
this.processTokenRelationships();
|
66
144
|
return this.auRelationships;
|
67
145
|
}
|
68
146
|
getHierarchicalView() {
|
147
|
+
this.processTokenRelationships();
|
69
148
|
// Get root level AUs (those without parents)
|
70
149
|
const roots = Array.from(this.auRelationships.values())
|
71
150
|
.filter(r => !r.parentId);
|
@@ -76,6 +155,9 @@ export class AccountUpdateAnalyzer {
|
|
76
155
|
label: auRelationship.label,
|
77
156
|
method: auRelationship.method,
|
78
157
|
stateChanges: auRelationship.stateChanges,
|
158
|
+
tokenId: auRelationship.tokenId,
|
159
|
+
failed: auRelationship.failed,
|
160
|
+
failureReason: auRelationship.failureReason,
|
79
161
|
children: auRelationship.children.map(childId => {
|
80
162
|
const child = this.auRelationships.get(childId);
|
81
163
|
return child ? buildTree(child) : null;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountUpdateAnalyzer.js","sourceRoot":"","sources":["../../src/AccountUpdateAnalyzer.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,qBAAqB;
|
1
|
+
{"version":3,"file":"AccountUpdateAnalyzer.js","sourceRoot":"","sources":["../../src/AccountUpdateAnalyzer.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const adaptBlockchainTransaction: (blockchainTx: any) => any;
|
@@ -0,0 +1,184 @@
|
|
1
|
+
export const adaptBlockchainTransaction = (blockchainTx) => {
|
2
|
+
// If the transaction is already in the expected format, return it as is
|
3
|
+
if (blockchainTx?.transaction?.accountUpdates) {
|
4
|
+
return blockchainTx;
|
5
|
+
}
|
6
|
+
const accountUpdates = [];
|
7
|
+
if (blockchainTx.updatedAccounts && Array.isArray(blockchainTx.updatedAccounts)) {
|
8
|
+
blockchainTx.updatedAccounts.forEach((account, index) => {
|
9
|
+
// Create an account update object similar to what o1js would generate
|
10
|
+
const accountUpdate = createAUFromBlockchainData(account, index, blockchainTx);
|
11
|
+
accountUpdates.push(accountUpdate);
|
12
|
+
});
|
13
|
+
}
|
14
|
+
return {
|
15
|
+
transaction: {
|
16
|
+
accountUpdates,
|
17
|
+
hash: blockchainTx.txHash,
|
18
|
+
blockHeight: blockchainTx.blockHeight,
|
19
|
+
memo: blockchainTx.memo || '',
|
20
|
+
status: blockchainTx.txStatus,
|
21
|
+
failures: blockchainTx.failures || []
|
22
|
+
},
|
23
|
+
originalBlockchainData: blockchainTx // Keep the original data for reference
|
24
|
+
};
|
25
|
+
};
|
26
|
+
const createAUFromBlockchainData = (account, index, tx) => {
|
27
|
+
// Check if this update failed
|
28
|
+
const isFailedUpdate = tx.failures && tx.failures.some((f) => f.index === index);
|
29
|
+
const failureReason = isFailedUpdate
|
30
|
+
? tx.failures.find((f) => f.index === index)?.failureReason
|
31
|
+
: undefined;
|
32
|
+
const isProof = account.update?.permissions?.editState === 'proof' ||
|
33
|
+
account.update?.permissions?.send === 'proof';
|
34
|
+
const isSignature = account.update?.permissions?.incrementNonce === 'signature' ||
|
35
|
+
account.update?.permissions?.setDelegate === 'signature';
|
36
|
+
// Generate unique ID similar to what o1js would use
|
37
|
+
const id = `${tx.txHash}-${index}`;
|
38
|
+
// Determine if this is a contract
|
39
|
+
const isContract = account.isZkappAccount ||
|
40
|
+
account.update?.verificationKey !== null ||
|
41
|
+
isProof;
|
42
|
+
// Create a label for the account update
|
43
|
+
let label = isContract ? `Contract-${account.accountAddress.substring(0, 8)}` :
|
44
|
+
`Account-${account.accountAddress.substring(0, 8)}`;
|
45
|
+
// Add status to label if failed
|
46
|
+
if (isFailedUpdate) {
|
47
|
+
label = `[FAILED] ${label}`;
|
48
|
+
}
|
49
|
+
// Create authorization based on permissions
|
50
|
+
const authorization = {};
|
51
|
+
if (isProof) {
|
52
|
+
authorization.proof = true;
|
53
|
+
}
|
54
|
+
else if (isSignature) {
|
55
|
+
authorization.signature = true;
|
56
|
+
}
|
57
|
+
// Extract and process state updates
|
58
|
+
const stateUpdates = extractStateUpdates(account.update);
|
59
|
+
// Create balance change info
|
60
|
+
const balanceChange = account.totalBalanceChange || 0;
|
61
|
+
const isNegative = balanceChange < 0;
|
62
|
+
return {
|
63
|
+
id,
|
64
|
+
label,
|
65
|
+
lazyAuthorization: {
|
66
|
+
kind: isProof ? 'lazy-proof' : isSignature ? 'lazy-signature' : 'none',
|
67
|
+
methodName: account.callData && account.callData !== '0' ? 'methodCall' : undefined,
|
68
|
+
args: account.callData && account.callData !== '0' ? [account.callData] : undefined
|
69
|
+
},
|
70
|
+
authorization,
|
71
|
+
body: {
|
72
|
+
publicKey: {
|
73
|
+
toBase58: () => account.accountAddress
|
74
|
+
},
|
75
|
+
balanceChange: {
|
76
|
+
magnitude: Math.abs(balanceChange).toString(),
|
77
|
+
isNegative: () => isNegative,
|
78
|
+
toString: () => (isNegative ? '-' : '') + Math.abs(balanceChange).toString()
|
79
|
+
},
|
80
|
+
update: {
|
81
|
+
appState: extractAppState(account.update),
|
82
|
+
verificationKey: {
|
83
|
+
value: {
|
84
|
+
hash: account.verificationKeyHash,
|
85
|
+
data: account.update?.verificationKey
|
86
|
+
}
|
87
|
+
},
|
88
|
+
permissions: {
|
89
|
+
value: mapPermissions(account.update?.permissions)
|
90
|
+
}
|
91
|
+
}
|
92
|
+
},
|
93
|
+
// Additional metadata for blockchain-specific information
|
94
|
+
metadata: {
|
95
|
+
callDepth: account.callDepth || 0,
|
96
|
+
tokenId: account.tokenId,
|
97
|
+
isZkappAccount: account.isZkappAccount,
|
98
|
+
incrementNonce: account.incrementNonce,
|
99
|
+
failed: isFailedUpdate,
|
100
|
+
failureReason: failureReason,
|
101
|
+
stateUpdates: stateUpdates
|
102
|
+
}
|
103
|
+
};
|
104
|
+
};
|
105
|
+
const extractAppState = (update) => {
|
106
|
+
if (!update || !update.appState || !Array.isArray(update.appState)) {
|
107
|
+
return [];
|
108
|
+
}
|
109
|
+
return update.appState.map((state) => state || '0');
|
110
|
+
};
|
111
|
+
const extractStateUpdates = (update) => {
|
112
|
+
if (!update)
|
113
|
+
return [];
|
114
|
+
const stateUpdates = [];
|
115
|
+
// Check appState
|
116
|
+
if (update.appState && Array.isArray(update.appState)) {
|
117
|
+
stateUpdates.push({
|
118
|
+
type: 'appState',
|
119
|
+
value: update.appState
|
120
|
+
});
|
121
|
+
}
|
122
|
+
// Check for delegate changes
|
123
|
+
if (update.delegatee) {
|
124
|
+
stateUpdates.push({
|
125
|
+
type: 'delegate',
|
126
|
+
value: update.delegatee
|
127
|
+
});
|
128
|
+
}
|
129
|
+
// Check for timing changes
|
130
|
+
if (update.timing) {
|
131
|
+
stateUpdates.push({
|
132
|
+
type: 'timing',
|
133
|
+
value: update.timing
|
134
|
+
});
|
135
|
+
}
|
136
|
+
// Check for token symbol changes
|
137
|
+
if (update.tokenSymbol) {
|
138
|
+
stateUpdates.push({
|
139
|
+
type: 'tokenSymbol',
|
140
|
+
value: update.tokenSymbol
|
141
|
+
});
|
142
|
+
}
|
143
|
+
// Check for other updates like votingFor or zkappUri
|
144
|
+
if (update.votingFor) {
|
145
|
+
stateUpdates.push({
|
146
|
+
type: 'votingFor',
|
147
|
+
value: update.votingFor
|
148
|
+
});
|
149
|
+
}
|
150
|
+
if (update.zkappUri) {
|
151
|
+
stateUpdates.push({
|
152
|
+
type: 'zkappUri',
|
153
|
+
value: update.zkappUri
|
154
|
+
});
|
155
|
+
}
|
156
|
+
return stateUpdates;
|
157
|
+
};
|
158
|
+
const mapPermissions = (permissions) => {
|
159
|
+
if (!permissions)
|
160
|
+
return {};
|
161
|
+
const createPermission = (type) => {
|
162
|
+
const isProof = permissions[type] === 'proof';
|
163
|
+
const isSignature = permissions[type] === 'signature';
|
164
|
+
return {
|
165
|
+
constant: { toBoolean: () => permissions[type] === 'none' },
|
166
|
+
signatureNecessary: { toBoolean: () => isSignature },
|
167
|
+
signatureSufficient: { toBoolean: () => isSignature },
|
168
|
+
proof: { toBoolean: () => isProof }
|
169
|
+
};
|
170
|
+
};
|
171
|
+
const permissionTypes = [
|
172
|
+
'editState', 'send', 'receive', 'setDelegate', 'setPermissions',
|
173
|
+
'setVerificationKey', 'setZkappUri', 'editActionState', 'setTokenSymbol',
|
174
|
+
'incrementNonce', 'setVotingFor', 'setTiming'
|
175
|
+
];
|
176
|
+
const mappedPermissions = {};
|
177
|
+
permissionTypes.forEach(type => {
|
178
|
+
if (permissions[type] !== undefined) {
|
179
|
+
mappedPermissions[type] = createPermission(type);
|
180
|
+
}
|
181
|
+
});
|
182
|
+
return mappedPermissions;
|
183
|
+
};
|
184
|
+
//# sourceMappingURL=BlockchainAdapter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"BlockchainAdapter.js","sourceRoot":"","sources":["../../src/BlockchainAdapter.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { TransactionState, TransactionFlowGraph } from './Interface.js';
|
2
|
+
export declare class BlockchainFlowAnalyzer {
|
3
|
+
analyzeTransactionFlow: (blockchainTx: any) => TransactionFlowGraph;
|
4
|
+
private processAccountUpdates;
|
5
|
+
private mapFailureInfo;
|
6
|
+
private buildCallDepthRelationships;
|
7
|
+
private buildStateDepRelationships;
|
8
|
+
private buildTokenRelationships;
|
9
|
+
private buildFeepayerRelationships;
|
10
|
+
private buildCallDataRelationships;
|
11
|
+
private buildTemporalRelationships;
|
12
|
+
private mergeRelationships;
|
13
|
+
private applyFailureStatus;
|
14
|
+
private extractTokenSymbol;
|
15
|
+
private extractStateValues;
|
16
|
+
enhanceTransactionState: (txState: TransactionState, blockchainTx: any) => TransactionState;
|
17
|
+
}
|