@hashgraphonline/standards-sdk 0.1.143-feat-adapter-registry.canary.fb173dc.54 → 0.1.143-feat-adapter-registry.canary.2e9e1c4.55
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/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/standards-sdk.es111.js +5 -5
- package/dist/es/standards-sdk.es121.js +1 -1
- package/dist/es/standards-sdk.es122.js +1 -1
- package/dist/es/standards-sdk.es123.js +5 -5
- package/dist/es/standards-sdk.es125.js +1 -1
- package/dist/es/standards-sdk.es126.js +1 -1
- package/dist/es/standards-sdk.es128.js +1 -1
- package/dist/es/standards-sdk.es131.js +1 -1
- package/dist/es/standards-sdk.es138.js +1 -1
- package/dist/es/standards-sdk.es147.js +12 -12282
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +168 -13
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +321 -55
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es150.js +331 -67
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +410 -129
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +209 -200
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +64 -334
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +12229 -395
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +55 -330
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +66 -60
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +1 -1
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es28.js +1 -1
- package/dist/es/standards-sdk.es31.js +1 -1
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es36.js +1 -1
- package/dist/es/standards-sdk.es37.js +1 -1
- package/dist/es/standards-sdk.es38.js +1 -1
- package/dist/es/standards-sdk.es57.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es63.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/package.json +3 -1
|
@@ -1,175 +1,456 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { proto } from "@hashgraph/proto";
|
|
2
|
+
import { Long, Hbar, HbarUnit, ContractId, AccountId, FileId } from "@hashgraph/sdk";
|
|
3
3
|
import { Buffer } from "buffer";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { hasTransactionType, parseKey } from "./standards-sdk.es153.js";
|
|
5
|
+
class SCSParser {
|
|
6
|
+
/**
|
|
7
|
+
* Parse Smart Contract Service transaction using unified dual-branch approach
|
|
8
|
+
* This handles both regular transactions and signed transaction variants
|
|
9
|
+
*/
|
|
10
|
+
static parseSCSTransaction(transaction, originalBytes) {
|
|
11
|
+
try {
|
|
12
|
+
if (originalBytes || transaction.toBytes) {
|
|
13
|
+
try {
|
|
14
|
+
const bytesToParse = originalBytes || transaction.toBytes();
|
|
15
|
+
const decoded = proto.TransactionList.decode(bytesToParse);
|
|
16
|
+
if (decoded.transactionList && decoded.transactionList.length > 0) {
|
|
17
|
+
const tx = decoded.transactionList[0];
|
|
18
|
+
let txBody = null;
|
|
19
|
+
if (tx.bodyBytes && tx.bodyBytes.length > 0) {
|
|
20
|
+
txBody = proto.TransactionBody.decode(tx.bodyBytes);
|
|
21
|
+
} else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
|
|
22
|
+
const signedTx = proto.SignedTransaction.decode(
|
|
23
|
+
tx.signedTransactionBytes
|
|
24
|
+
);
|
|
25
|
+
if (signedTx.bodyBytes) {
|
|
26
|
+
txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (txBody) {
|
|
30
|
+
const protoResult = this.parseFromProtobufTxBody(txBody);
|
|
31
|
+
if (protoResult.type && protoResult.type !== "UNKNOWN") {
|
|
32
|
+
return protoResult;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch (protoError) {
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return this.parseFromTransactionInternals(transaction);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
return {
|
|
42
|
+
type: "UNKNOWN",
|
|
43
|
+
humanReadableType: "Unknown Contract Transaction"
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse contract transaction from protobuf TransactionBody
|
|
49
|
+
* Handles all contract operations from decoded protobuf data
|
|
50
|
+
*/
|
|
51
|
+
static parseFromProtobufTxBody(txBody) {
|
|
52
|
+
if (txBody.contractCall) {
|
|
53
|
+
const contractCall = this.parseContractCall(txBody.contractCall);
|
|
54
|
+
if (contractCall) {
|
|
55
|
+
return {
|
|
56
|
+
type: "CONTRACTCALL",
|
|
57
|
+
humanReadableType: "Contract Call",
|
|
58
|
+
contractCall
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (txBody.contractCreateInstance) {
|
|
63
|
+
const contractCreate = this.parseContractCreate(
|
|
64
|
+
txBody.contractCreateInstance
|
|
65
|
+
);
|
|
66
|
+
if (contractCreate) {
|
|
67
|
+
return {
|
|
68
|
+
type: "CONTRACTCREATE",
|
|
69
|
+
humanReadableType: "Contract Create",
|
|
70
|
+
contractCreate
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (txBody.contractUpdateInstance) {
|
|
75
|
+
const contractUpdate = this.parseContractUpdate(
|
|
76
|
+
txBody.contractUpdateInstance
|
|
77
|
+
);
|
|
78
|
+
if (contractUpdate) {
|
|
79
|
+
return {
|
|
80
|
+
type: "CONTRACTUPDATE",
|
|
81
|
+
humanReadableType: "Contract Update",
|
|
82
|
+
contractUpdate
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (txBody.contractDeleteInstance) {
|
|
87
|
+
const contractDelete = this.parseContractDelete(
|
|
88
|
+
txBody.contractDeleteInstance
|
|
89
|
+
);
|
|
90
|
+
if (contractDelete) {
|
|
91
|
+
return {
|
|
92
|
+
type: "CONTRACTDELETE",
|
|
93
|
+
humanReadableType: "Contract Delete",
|
|
94
|
+
contractDelete
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (txBody.ethereumTransaction) {
|
|
99
|
+
const ethereumCall = this.parseEthereumTransaction(
|
|
100
|
+
txBody.ethereumTransaction
|
|
101
|
+
);
|
|
102
|
+
if (ethereumCall) {
|
|
103
|
+
return {
|
|
104
|
+
type: "ETHEREUMTRANSACTION",
|
|
105
|
+
humanReadableType: "Ethereum Transaction",
|
|
106
|
+
ethereumTransaction: ethereumCall
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Extract contract data from Transaction internal fields
|
|
114
|
+
* This handles cases where data is stored in Transaction object internals
|
|
115
|
+
*/
|
|
116
|
+
static parseFromTransactionInternals(transaction) {
|
|
117
|
+
try {
|
|
118
|
+
const tx = transaction;
|
|
119
|
+
if (tx._contractId && tx._gas) {
|
|
120
|
+
const contractCall = {
|
|
121
|
+
contractId: tx._contractId.toString(),
|
|
122
|
+
gas: typeof tx._gas === "number" ? tx._gas : Long.fromValue(tx._gas).toNumber(),
|
|
123
|
+
amount: tx._amount ? parseFloat(tx._amount.toString()) : 0
|
|
124
|
+
};
|
|
125
|
+
if (tx._functionParameters) {
|
|
126
|
+
const funcParams = Buffer.from(tx._functionParameters).toString(
|
|
127
|
+
"hex"
|
|
128
|
+
);
|
|
129
|
+
contractCall.functionParameters = funcParams;
|
|
130
|
+
contractCall.functionName = this.extractFunctionName(funcParams);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
type: "CONTRACTCALL",
|
|
134
|
+
humanReadableType: "Contract Call",
|
|
135
|
+
contractCall
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (hasTransactionType(transaction, "contractCreateInstance")) {
|
|
139
|
+
const contractCreate = {
|
|
140
|
+
gas: tx._gas.toString(),
|
|
141
|
+
initialBalance: tx._initialBalance?.toString() || "0"
|
|
142
|
+
};
|
|
143
|
+
if (tx._fileId) {
|
|
144
|
+
contractCreate.initcodeSource = "fileID";
|
|
145
|
+
contractCreate.initcode = tx._fileId.toString();
|
|
146
|
+
} else if (tx._bytecode) {
|
|
147
|
+
contractCreate.initcodeSource = "bytes";
|
|
148
|
+
contractCreate.initcode = Buffer.from(tx._bytecode).toString("hex");
|
|
149
|
+
}
|
|
150
|
+
if (tx._constructorParameters) {
|
|
151
|
+
contractCreate.constructorParameters = Buffer.from(
|
|
152
|
+
tx._constructorParameters
|
|
153
|
+
).toString("hex");
|
|
154
|
+
}
|
|
155
|
+
if (tx._memo) contractCreate.memo = tx._memo;
|
|
156
|
+
if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);
|
|
157
|
+
if (tx._maxAutomaticTokenAssociations !== void 0) {
|
|
158
|
+
contractCreate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
|
|
159
|
+
}
|
|
160
|
+
if (tx._stakedAccountId) {
|
|
161
|
+
contractCreate.stakedAccountId = tx._stakedAccountId.toString();
|
|
162
|
+
} else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
|
|
163
|
+
contractCreate.stakedNodeId = Long.fromValue(
|
|
164
|
+
tx._stakedNodeId
|
|
165
|
+
).toString();
|
|
166
|
+
}
|
|
167
|
+
if (tx._declineReward !== void 0)
|
|
168
|
+
contractCreate.declineReward = tx._declineReward;
|
|
169
|
+
if (tx._autoRenewPeriod)
|
|
170
|
+
contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();
|
|
171
|
+
return {
|
|
172
|
+
type: "CONTRACTCREATE",
|
|
173
|
+
humanReadableType: "Contract Create",
|
|
174
|
+
contractCreate
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (hasTransactionType(transaction, "contractUpdateInstance")) {
|
|
178
|
+
const contractUpdate = {
|
|
179
|
+
contractIdToUpdate: tx._contractId.toString()
|
|
180
|
+
};
|
|
181
|
+
if (tx._memo) contractUpdate.memo = tx._memo;
|
|
182
|
+
if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);
|
|
183
|
+
if (tx._maxAutomaticTokenAssociations !== void 0) {
|
|
184
|
+
contractUpdate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
|
|
185
|
+
}
|
|
186
|
+
if (tx._stakedAccountId) {
|
|
187
|
+
contractUpdate.stakedAccountId = tx._stakedAccountId.toString();
|
|
188
|
+
} else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
|
|
189
|
+
contractUpdate.stakedNodeId = Long.fromValue(
|
|
190
|
+
tx._stakedNodeId
|
|
191
|
+
).toString();
|
|
192
|
+
}
|
|
193
|
+
if (tx._declineReward !== void 0)
|
|
194
|
+
contractUpdate.declineReward = tx._declineReward;
|
|
195
|
+
if (tx._autoRenewPeriod)
|
|
196
|
+
contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();
|
|
197
|
+
return {
|
|
198
|
+
type: "CONTRACTUPDATE",
|
|
199
|
+
humanReadableType: "Contract Update",
|
|
200
|
+
contractUpdate
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
if (hasTransactionType(transaction, "contractDeleteInstance")) {
|
|
204
|
+
const contractDelete = {
|
|
205
|
+
contractIdToDelete: tx._contractId.toString()
|
|
206
|
+
};
|
|
207
|
+
if (tx._transferAccountId) {
|
|
208
|
+
contractDelete.transferAccountId = tx._transferAccountId.toString();
|
|
209
|
+
} else if (tx._transferContractId) {
|
|
210
|
+
contractDelete.transferContractId = tx._transferContractId.toString();
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
type: "CONTRACTDELETE",
|
|
214
|
+
humanReadableType: "Contract Delete",
|
|
215
|
+
contractDelete
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {};
|
|
219
|
+
} catch (error) {
|
|
220
|
+
return {};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Enhanced function name extraction from contract call parameters
|
|
225
|
+
* Attempts to decode function selector and map to known function names
|
|
226
|
+
*/
|
|
227
|
+
static extractFunctionName(functionParameters) {
|
|
228
|
+
if (functionParameters.length < 8) return "unknown";
|
|
229
|
+
const selector = functionParameters.substring(0, 8);
|
|
230
|
+
const commonSelectors = {
|
|
231
|
+
a9059cbb: "transfer",
|
|
232
|
+
"095ea7b3": "approve",
|
|
233
|
+
"23b872dd": "transferFrom",
|
|
234
|
+
"70a08231": "balanceOf",
|
|
235
|
+
dd62ed3e: "allowance",
|
|
236
|
+
"18160ddd": "totalSupply",
|
|
237
|
+
"06fdde03": "name",
|
|
238
|
+
"95d89b41": "symbol",
|
|
239
|
+
"313ce567": "decimals",
|
|
240
|
+
"42842e0e": "safeTransferFrom",
|
|
241
|
+
b88d4fde: "safeTransferFrom",
|
|
242
|
+
e985e9c5: "isApprovedForAll",
|
|
243
|
+
a22cb465: "setApprovalForAll",
|
|
244
|
+
"6352211e": "ownerOf",
|
|
245
|
+
c87b56dd: "tokenURI",
|
|
246
|
+
"01ffc9a7": "supportsInterface",
|
|
247
|
+
"40c10f19": "mint",
|
|
248
|
+
"42966c68": "burn",
|
|
249
|
+
f2fde38b: "transferOwnership",
|
|
250
|
+
"715018a6": "renounceOwnership",
|
|
251
|
+
"8da5cb5b": "owner"
|
|
252
|
+
};
|
|
253
|
+
return commonSelectors[selector] || selector;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Parse Ethereum Transaction (was completely missing from original parser)
|
|
257
|
+
*/
|
|
258
|
+
static parseEthereumTransaction(body) {
|
|
259
|
+
if (!body) return void 0;
|
|
260
|
+
const data = {
|
|
261
|
+
contractId: "EVM",
|
|
262
|
+
gas: body.maxGasAllowance ? Long.fromValue(body.maxGasAllowance).toNumber() : 0,
|
|
263
|
+
amount: 0
|
|
264
|
+
};
|
|
265
|
+
if (body.ethereumData && body.ethereumData.length > 0) {
|
|
266
|
+
const ethData = Buffer.from(body.ethereumData).toString("hex");
|
|
267
|
+
data.functionParameters = ethData;
|
|
268
|
+
if (ethData.length >= 8) {
|
|
269
|
+
data.functionName = this.extractFunctionName(ethData);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return data;
|
|
273
|
+
}
|
|
274
|
+
static parseContractCall(body) {
|
|
275
|
+
if (!body) return void 0;
|
|
276
|
+
const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));
|
|
277
|
+
const data = {
|
|
278
|
+
contractId: new ContractId(
|
|
279
|
+
body.contractID.shardNum ?? 0,
|
|
280
|
+
body.contractID.realmNum ?? 0,
|
|
281
|
+
body.contractID.contractNum ?? 0
|
|
282
|
+
).toString(),
|
|
283
|
+
gas: Long.fromValue(body.gas ?? 0).toNumber(),
|
|
284
|
+
amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar))
|
|
285
|
+
};
|
|
286
|
+
if (body.functionParameters) {
|
|
287
|
+
data.functionParameters = Buffer.from(body.functionParameters).toString(
|
|
288
|
+
"hex"
|
|
289
|
+
);
|
|
290
|
+
if (data.functionParameters.length >= 8) {
|
|
291
|
+
data.functionName = this.extractFunctionName(data.functionParameters);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return data;
|
|
295
|
+
}
|
|
296
|
+
static parseContractCreate(body) {
|
|
6
297
|
if (!body) return void 0;
|
|
7
298
|
const data = {};
|
|
299
|
+
if (body.initialBalance) {
|
|
300
|
+
data.initialBalance = Hbar.fromTinybars(
|
|
301
|
+
Long.fromValue(body.initialBalance)
|
|
302
|
+
).toString(HbarUnit.Hbar);
|
|
303
|
+
}
|
|
304
|
+
if (body.gas) {
|
|
305
|
+
data.gas = Long.fromValue(body.gas).toString();
|
|
306
|
+
}
|
|
307
|
+
if (body.adminKey) {
|
|
308
|
+
data.adminKey = parseKey(body.adminKey);
|
|
309
|
+
}
|
|
310
|
+
if (body.constructorParameters) {
|
|
311
|
+
data.constructorParameters = Buffer.from(
|
|
312
|
+
body.constructorParameters
|
|
313
|
+
).toString("hex");
|
|
314
|
+
}
|
|
8
315
|
if (body.memo) {
|
|
9
316
|
data.memo = body.memo;
|
|
10
317
|
}
|
|
11
|
-
data.adminKey = parseKey(body.adminKey);
|
|
12
|
-
data.submitKey = parseKey(body.submitKey);
|
|
13
318
|
if (body.autoRenewPeriod?.seconds) {
|
|
14
319
|
data.autoRenewPeriod = Long.fromValue(
|
|
15
320
|
body.autoRenewPeriod.seconds
|
|
16
321
|
).toString();
|
|
17
322
|
}
|
|
18
|
-
if (body.
|
|
19
|
-
data.
|
|
20
|
-
body.
|
|
21
|
-
body.
|
|
22
|
-
body.
|
|
323
|
+
if (body.stakedAccountId) {
|
|
324
|
+
data.stakedAccountId = new AccountId(
|
|
325
|
+
body.stakedAccountId.shardNum ?? 0,
|
|
326
|
+
body.stakedAccountId.realmNum ?? 0,
|
|
327
|
+
body.stakedAccountId.accountNum ?? 0
|
|
23
328
|
).toString();
|
|
329
|
+
} else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0) {
|
|
330
|
+
data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
|
|
24
331
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
static parseConsensusSubmitMessage(body) {
|
|
28
|
-
if (!body) return void 0;
|
|
29
|
-
const data = {};
|
|
30
|
-
if (body.topicID) {
|
|
31
|
-
data.topicId = `${body.topicID.shardNum ?? 0}.${body.topicID.realmNum ?? 0}.${body.topicID.topicNum ?? 0}`;
|
|
32
|
-
}
|
|
33
|
-
if (body.message?.length > 0) {
|
|
34
|
-
const messageBuffer = Buffer.from(body.message);
|
|
35
|
-
const utf8String = messageBuffer.toString("utf8");
|
|
36
|
-
if (/[\x00-\x08\x0B\x0E-\x1F\x7F]/.test(utf8String) || utf8String.includes("�")) {
|
|
37
|
-
data.message = messageBuffer.toString("base64");
|
|
38
|
-
data.messageEncoding = "base64";
|
|
39
|
-
} else {
|
|
40
|
-
data.message = utf8String;
|
|
41
|
-
data.messageEncoding = "utf8";
|
|
42
|
-
}
|
|
332
|
+
if (body.declineReward !== void 0) {
|
|
333
|
+
data.declineReward = body.declineReward;
|
|
43
334
|
}
|
|
44
|
-
if (body.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
335
|
+
if (body.maxAutomaticTokenAssociations !== void 0) {
|
|
336
|
+
data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;
|
|
337
|
+
}
|
|
338
|
+
if (body.fileID) {
|
|
339
|
+
data.initcodeSource = "fileID";
|
|
340
|
+
data.initcode = new FileId(
|
|
341
|
+
body.fileID.shardNum ?? 0,
|
|
342
|
+
body.fileID.realmNum ?? 0,
|
|
343
|
+
body.fileID.fileNum ?? 0
|
|
344
|
+
).toString();
|
|
345
|
+
} else if (body.initcode && body.initcode.length > 0) {
|
|
346
|
+
data.initcodeSource = "bytes";
|
|
347
|
+
data.initcode = Buffer.from(body.initcode).toString("hex");
|
|
58
348
|
}
|
|
59
349
|
return data;
|
|
60
350
|
}
|
|
61
|
-
static
|
|
351
|
+
static parseContractUpdate(body) {
|
|
62
352
|
if (!body) return void 0;
|
|
63
353
|
const data = {};
|
|
64
|
-
if (body.
|
|
65
|
-
data.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
354
|
+
if (body.contractID) {
|
|
355
|
+
data.contractIdToUpdate = new ContractId(
|
|
356
|
+
body.contractID.shardNum ?? 0,
|
|
357
|
+
body.contractID.realmNum ?? 0,
|
|
358
|
+
body.contractID.contractNum ?? 0
|
|
359
|
+
).toString();
|
|
69
360
|
}
|
|
70
|
-
if (body.adminKey
|
|
71
|
-
data.clearAdminKey = true;
|
|
72
|
-
data.adminKey = void 0;
|
|
73
|
-
} else if (body.adminKey) {
|
|
361
|
+
if (body.adminKey) {
|
|
74
362
|
data.adminKey = parseKey(body.adminKey);
|
|
75
|
-
} else {
|
|
76
|
-
data.adminKey = void 0;
|
|
77
363
|
}
|
|
78
|
-
if (body.
|
|
79
|
-
data.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
data.submitKey = parseKey(body.submitKey);
|
|
83
|
-
} else {
|
|
84
|
-
data.submitKey = void 0;
|
|
364
|
+
if (body.expirationTime?.seconds) {
|
|
365
|
+
data.expirationTime = `${Long.fromValue(
|
|
366
|
+
body.expirationTime.seconds
|
|
367
|
+
).toString()}.${body.expirationTime.nanos}`;
|
|
85
368
|
}
|
|
86
369
|
if (body.autoRenewPeriod?.seconds) {
|
|
87
370
|
data.autoRenewPeriod = Long.fromValue(
|
|
88
371
|
body.autoRenewPeriod.seconds
|
|
89
372
|
).toString();
|
|
90
373
|
}
|
|
91
|
-
if (body.
|
|
374
|
+
if (body.memo) {
|
|
375
|
+
const memoUnion = body.memo;
|
|
376
|
+
if (memoUnion && typeof memoUnion === "object" && Object.prototype.hasOwnProperty.call(memoUnion, "value")) {
|
|
377
|
+
const value = memoUnion.value;
|
|
378
|
+
if (value === null || value === void 0) {
|
|
379
|
+
data.memo = void 0;
|
|
380
|
+
} else {
|
|
381
|
+
data.memo = String(value);
|
|
382
|
+
}
|
|
383
|
+
} else if (typeof memoUnion === "string") {
|
|
384
|
+
data.memo = memoUnion;
|
|
385
|
+
} else {
|
|
386
|
+
data.memo = void 0;
|
|
387
|
+
}
|
|
388
|
+
} else {
|
|
389
|
+
data.memo = void 0;
|
|
390
|
+
}
|
|
391
|
+
if (body.stakedAccountId) {
|
|
392
|
+
data.stakedAccountId = new AccountId(
|
|
393
|
+
body.stakedAccountId.shardNum ?? 0,
|
|
394
|
+
body.stakedAccountId.realmNum ?? 0,
|
|
395
|
+
body.stakedAccountId.accountNum ?? 0
|
|
396
|
+
).toString();
|
|
397
|
+
data.stakedNodeId = void 0;
|
|
398
|
+
} else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0 && Long.fromValue(body.stakedNodeId).notEquals(-1)) {
|
|
399
|
+
data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
|
|
400
|
+
data.stakedAccountId = void 0;
|
|
401
|
+
} else {
|
|
402
|
+
data.stakedNodeId = void 0;
|
|
403
|
+
data.stakedAccountId = void 0;
|
|
404
|
+
}
|
|
405
|
+
if (body.declineReward?.value !== void 0) {
|
|
406
|
+
data.declineReward = body.declineReward.value;
|
|
407
|
+
}
|
|
408
|
+
if (body.maxAutomaticTokenAssociations?.value !== void 0) {
|
|
409
|
+
data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations.value;
|
|
410
|
+
}
|
|
411
|
+
if (body.autoRenewAccountId) {
|
|
92
412
|
data.autoRenewAccountId = new AccountId(
|
|
93
|
-
body.
|
|
94
|
-
body.
|
|
95
|
-
body.
|
|
413
|
+
body.autoRenewAccountId.shardNum ?? 0,
|
|
414
|
+
body.autoRenewAccountId.realmNum ?? 0,
|
|
415
|
+
body.autoRenewAccountId.accountNum ?? 0
|
|
96
416
|
).toString();
|
|
97
417
|
}
|
|
98
418
|
return data;
|
|
99
419
|
}
|
|
100
|
-
static
|
|
420
|
+
static parseContractDelete(body) {
|
|
101
421
|
if (!body) return void 0;
|
|
102
422
|
const data = {};
|
|
103
|
-
if (body.
|
|
104
|
-
data.
|
|
423
|
+
if (body.contractID) {
|
|
424
|
+
data.contractIdToDelete = new ContractId(
|
|
425
|
+
body.contractID.shardNum ?? 0,
|
|
426
|
+
body.contractID.realmNum ?? 0,
|
|
427
|
+
body.contractID.contractNum ?? 0
|
|
428
|
+
).toString();
|
|
429
|
+
}
|
|
430
|
+
if (body.transferAccountID) {
|
|
431
|
+
data.transferAccountId = new AccountId(
|
|
432
|
+
body.transferAccountID.shardNum ?? 0,
|
|
433
|
+
body.transferAccountID.realmNum ?? 0,
|
|
434
|
+
body.transferAccountID.accountNum ?? 0
|
|
435
|
+
).toString();
|
|
436
|
+
} else if (body.transferContractID) {
|
|
437
|
+
data.transferContractId = new ContractId(
|
|
438
|
+
body.transferContractID.shardNum ?? 0,
|
|
439
|
+
body.transferContractID.realmNum ?? 0,
|
|
440
|
+
body.transferContractID.contractNum ?? 0
|
|
441
|
+
).toString();
|
|
105
442
|
}
|
|
106
443
|
return data;
|
|
107
444
|
}
|
|
108
445
|
/**
|
|
109
|
-
* Parse
|
|
110
|
-
* This is the unified entry point that
|
|
446
|
+
* Parse SCS (Smart Contract Service) transaction from Transaction object
|
|
447
|
+
* This is the unified entry point that delegates to the comprehensive parsing logic
|
|
111
448
|
*/
|
|
112
449
|
static parseFromTransactionObject(transaction) {
|
|
113
|
-
|
|
114
|
-
const transactionBody = transaction._transactionBody;
|
|
115
|
-
if (!transactionBody) {
|
|
116
|
-
return {};
|
|
117
|
-
}
|
|
118
|
-
if (transactionBody.consensusCreateTopic) {
|
|
119
|
-
const consensusCreateTopic = this.parseConsensusCreateTopic(
|
|
120
|
-
transactionBody.consensusCreateTopic
|
|
121
|
-
);
|
|
122
|
-
if (consensusCreateTopic) {
|
|
123
|
-
return {
|
|
124
|
-
type: "TOPICCREATE",
|
|
125
|
-
humanReadableType: "Topic Create",
|
|
126
|
-
consensusCreateTopic
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (transactionBody.consensusSubmitMessage) {
|
|
131
|
-
const consensusSubmitMessage = this.parseConsensusSubmitMessage(
|
|
132
|
-
transactionBody.consensusSubmitMessage
|
|
133
|
-
);
|
|
134
|
-
if (consensusSubmitMessage) {
|
|
135
|
-
return {
|
|
136
|
-
type: "CONSENSUSSUBMITMESSAGE",
|
|
137
|
-
humanReadableType: "Submit Message",
|
|
138
|
-
consensusSubmitMessage
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (transactionBody.consensusUpdateTopic) {
|
|
143
|
-
const consensusUpdateTopic = this.parseConsensusUpdateTopic(
|
|
144
|
-
transactionBody.consensusUpdateTopic
|
|
145
|
-
);
|
|
146
|
-
if (consensusUpdateTopic) {
|
|
147
|
-
return {
|
|
148
|
-
type: "TOPICUPDATE",
|
|
149
|
-
humanReadableType: "Topic Update",
|
|
150
|
-
consensusUpdateTopic
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (transactionBody.consensusDeleteTopic) {
|
|
155
|
-
const consensusDeleteTopic = this.parseConsensusDeleteTopic(
|
|
156
|
-
transactionBody.consensusDeleteTopic
|
|
157
|
-
);
|
|
158
|
-
if (consensusDeleteTopic) {
|
|
159
|
-
return {
|
|
160
|
-
type: "TOPICDELETE",
|
|
161
|
-
humanReadableType: "Topic Delete",
|
|
162
|
-
consensusDeleteTopic
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return {};
|
|
167
|
-
} catch (error) {
|
|
168
|
-
return {};
|
|
169
|
-
}
|
|
450
|
+
return this.parseSCSTransaction(transaction);
|
|
170
451
|
}
|
|
171
452
|
}
|
|
172
453
|
export {
|
|
173
|
-
|
|
454
|
+
SCSParser
|
|
174
455
|
};
|
|
175
456
|
//# sourceMappingURL=standards-sdk.es151.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es151.js","sources":["../../src/utils/parsers/hcs-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { AccountId, Long, Transaction } from '@hashgraph/sdk';\nimport {\n ConsensusCreateTopicData,\n ConsensusSubmitMessageData,\n ConsensusUpdateTopicData,\n ConsensusDeleteTopicData,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\nimport { Buffer } from 'buffer';\n\nexport class HCSParser {\n static parseConsensusCreateTopic(\n body: proto.IConsensusCreateTopicTransactionBody,\n ): ConsensusCreateTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusCreateTopicData = {};\n if (body.memo) {\n data.memo = body.memo;\n }\n data.adminKey = parseKey(body.adminKey);\n data.submitKey = parseKey(body.submitKey);\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.autoRenewAccount) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseConsensusSubmitMessage(\n body: proto.IConsensusSubmitMessageTransactionBody,\n ): ConsensusSubmitMessageData | undefined {\n if (!body) return undefined;\n const data: ConsensusSubmitMessageData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum ?? 0}.${\n body.topicID.realmNum ?? 0\n }.${body.topicID.topicNum ?? 0}`;\n }\n if (body.message?.length > 0) {\n const messageBuffer = Buffer.from(body.message);\n const utf8String = messageBuffer.toString('utf8');\n if (\n /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(utf8String) ||\n utf8String.includes('\\uFFFD')\n ) {\n data.message = messageBuffer.toString('base64');\n data.messageEncoding = 'base64';\n } else {\n data.message = utf8String;\n data.messageEncoding = 'utf8';\n }\n }\n if (body.chunkInfo) {\n if (body.chunkInfo.initialTransactionID) {\n const txId = body.chunkInfo.initialTransactionID.accountID;\n const taValidStart =\n body.chunkInfo.initialTransactionID.transactionValidStart;\n if (txId && taValidStart) {\n data.chunkInfoInitialTransactionID = `${txId.shardNum ?? 0}.${\n txId.realmNum ?? 0\n }.${txId.accountNum ?? 0}@${taValidStart.seconds ?? 0}.${\n taValidStart.nanos ?? 0\n }`;\n }\n }\n if (\n body.chunkInfo.number !== undefined &&\n body.chunkInfo.number !== null\n ) {\n data.chunkInfoNumber = body.chunkInfo.number;\n }\n if (body.chunkInfo.total !== undefined && body.chunkInfo.total !== null) {\n data.chunkInfoTotal = body.chunkInfo.total;\n }\n }\n return data;\n }\n\n static parseConsensusUpdateTopic(\n body: proto.IConsensusUpdateTopicTransactionBody,\n ): ConsensusUpdateTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusUpdateTopicData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum}.${body.topicID.topicNum}`;\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n if (body.adminKey === null) {\n data.clearAdminKey = true;\n data.adminKey = undefined;\n } else if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n } else {\n data.adminKey = undefined;\n }\n if (body.submitKey === null) {\n data.clearSubmitKey = true;\n data.submitKey = undefined;\n } else if (body.submitKey) {\n data.submitKey = parseKey(body.submitKey);\n } else {\n data.submitKey = undefined;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.autoRenewAccount) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseConsensusDeleteTopic(\n body: proto.IConsensusDeleteTopicTransactionBody,\n ): ConsensusDeleteTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusDeleteTopicData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum ?? 0}.${\n body.topicID.topicNum ?? 0\n }`;\n }\n return data;\n }\n\n /**\n * Parse HCS transaction from Transaction object with comprehensive extraction\n * This is the unified entry point that handles both protobuf and internal field extraction\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const transactionBody = (\n transaction as unknown as { _transactionBody?: unknown }\n )._transactionBody as proto.ITransactionBody | undefined;\n\n if (!transactionBody) {\n return {};\n }\n\n if (transactionBody.consensusCreateTopic) {\n const consensusCreateTopic = this.parseConsensusCreateTopic(\n transactionBody.consensusCreateTopic,\n );\n if (consensusCreateTopic) {\n return {\n type: 'TOPICCREATE',\n humanReadableType: 'Topic Create',\n consensusCreateTopic,\n };\n }\n }\n\n if (transactionBody.consensusSubmitMessage) {\n const consensusSubmitMessage = this.parseConsensusSubmitMessage(\n transactionBody.consensusSubmitMessage,\n );\n if (consensusSubmitMessage) {\n return {\n type: 'CONSENSUSSUBMITMESSAGE',\n humanReadableType: 'Submit Message',\n consensusSubmitMessage,\n };\n }\n }\n\n if (transactionBody.consensusUpdateTopic) {\n const consensusUpdateTopic = this.parseConsensusUpdateTopic(\n transactionBody.consensusUpdateTopic,\n );\n if (consensusUpdateTopic) {\n return {\n type: 'TOPICUPDATE',\n humanReadableType: 'Topic Update',\n consensusUpdateTopic,\n };\n }\n }\n\n if (transactionBody.consensusDeleteTopic) {\n const consensusDeleteTopic = this.parseConsensusDeleteTopic(\n transactionBody.consensusDeleteTopic,\n );\n if (consensusDeleteTopic) {\n return {\n type: 'TOPICDELETE',\n humanReadableType: 'Topic Delete',\n consensusDeleteTopic,\n };\n }\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es151.js","sources":["../../src/utils/parsers/scs-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { ContractId, Hbar, HbarUnit, Long, Transaction } from '@hashgraph/sdk';\nimport {\n ContractCallData,\n ContractCreateData,\n ContractUpdateData,\n ContractDeleteData,\n} from '../transaction-parser-types';\nimport { Buffer } from 'buffer';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { AccountId, FileId } from '@hashgraph/sdk';\n\n/**\n * Smart Contract Service (SCS) Parser\n *\n * Handles parsing for all contract-related transaction types including:\n * - Contract calls (including EthereumTransaction)\n * - Contract creation, updates, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n */\nexport class SCSParser {\n /**\n * Parse Smart Contract Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseSCSTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n contractCall?: ContractCallData;\n contractCreate?: ContractCreateData;\n contractUpdate?: ContractUpdateData;\n contractDelete?: ContractDeleteData;\n [key: string]: unknown;\n } {\n try {\n if (originalBytes || transaction.toBytes) {\n try {\n const bytesToParse = originalBytes || transaction.toBytes();\n const decoded = proto.TransactionList.decode(bytesToParse);\n\n if (decoded.transactionList && decoded.transactionList.length > 0) {\n const tx = decoded.transactionList[0];\n let txBody: proto.ITransactionBody | null = null;\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n } else if (\n tx.signedTransactionBytes &&\n tx.signedTransactionBytes.length > 0\n ) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n txBody = proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n if (txBody) {\n const protoResult = this.parseFromProtobufTxBody(txBody);\n if (protoResult.type && protoResult.type !== 'UNKNOWN') {\n return protoResult;\n }\n }\n }\n } catch (protoError) {}\n }\n\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return {\n type: 'UNKNOWN',\n humanReadableType: 'Unknown Contract Transaction',\n };\n }\n }\n\n /**\n * Parse contract transaction from protobuf TransactionBody\n * Handles all contract operations from decoded protobuf data\n */\n private static parseFromProtobufTxBody(txBody: proto.ITransactionBody): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n if (txBody.contractCall) {\n const contractCall = this.parseContractCall(txBody.contractCall);\n if (contractCall) {\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n }\n\n if (txBody.contractCreateInstance) {\n const contractCreate = this.parseContractCreate(\n txBody.contractCreateInstance,\n );\n if (contractCreate) {\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n }\n\n if (txBody.contractUpdateInstance) {\n const contractUpdate = this.parseContractUpdate(\n txBody.contractUpdateInstance,\n );\n if (contractUpdate) {\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n }\n\n if (txBody.contractDeleteInstance) {\n const contractDelete = this.parseContractDelete(\n txBody.contractDeleteInstance,\n );\n if (contractDelete) {\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n }\n\n if (txBody.ethereumTransaction) {\n const ethereumCall = this.parseEthereumTransaction(\n txBody.ethereumTransaction,\n );\n if (ethereumCall) {\n return {\n type: 'ETHEREUMTRANSACTION',\n humanReadableType: 'Ethereum Transaction',\n ethereumTransaction: ethereumCall,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract contract data from Transaction internal fields\n * This handles cases where data is stored in Transaction object internals\n */\n private static parseFromTransactionInternals(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const tx = transaction as unknown as {\n _contractId?: { toString(): string };\n _gas?: number | Long;\n _amount?: { toString(): string };\n _functionParameters?: Uint8Array;\n _initialBalance?: { toString(): string };\n _adminKey?: unknown;\n _memo?: string;\n _fileId?: { toString(): string };\n _bytecode?: Uint8Array;\n _constructorParameters?: Uint8Array;\n _maxAutomaticTokenAssociations?: number;\n _stakedAccountId?: { toString(): string };\n _stakedNodeId?: number | Long;\n _declineReward?: boolean;\n _autoRenewPeriod?: { toString(): string };\n _transferAccountId?: { toString(): string };\n _transferContractId?: { toString(): string };\n constructor?: { name?: string };\n };\n\n if (tx._contractId && tx._gas) {\n const contractCall: ContractCallData = {\n contractId: tx._contractId.toString(),\n gas:\n typeof tx._gas === 'number'\n ? tx._gas\n : Long.fromValue(tx._gas).toNumber(),\n amount: tx._amount ? parseFloat(tx._amount.toString()) : 0,\n };\n\n if (tx._functionParameters) {\n const funcParams = Buffer.from(tx._functionParameters).toString(\n 'hex',\n );\n contractCall.functionParameters = funcParams;\n contractCall.functionName = this.extractFunctionName(funcParams);\n }\n\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n\n if (hasTransactionType(transaction, 'contractCreateInstance')) {\n const contractCreate: ContractCreateData = {\n gas: tx._gas.toString(),\n initialBalance: tx._initialBalance?.toString() || '0',\n };\n\n if (tx._fileId) {\n contractCreate.initcodeSource = 'fileID';\n contractCreate.initcode = tx._fileId.toString();\n } else if (tx._bytecode) {\n contractCreate.initcodeSource = 'bytes';\n contractCreate.initcode = Buffer.from(tx._bytecode).toString('hex');\n }\n\n if (tx._constructorParameters) {\n contractCreate.constructorParameters = Buffer.from(\n tx._constructorParameters,\n ).toString('hex');\n }\n\n if (tx._memo) contractCreate.memo = tx._memo;\n if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractCreate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractCreate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractCreate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractCreate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractUpdateInstance')) {\n const contractUpdate: ContractUpdateData = {\n contractIdToUpdate: tx._contractId.toString(),\n };\n\n if (tx._memo) contractUpdate.memo = tx._memo;\n if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractUpdate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractUpdate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractUpdate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractUpdate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractDeleteInstance')) {\n const contractDelete: ContractDeleteData = {\n contractIdToDelete: tx._contractId.toString(),\n };\n\n if (tx._transferAccountId) {\n contractDelete.transferAccountId = tx._transferAccountId.toString();\n } else if (tx._transferContractId) {\n contractDelete.transferContractId = tx._transferContractId.toString();\n }\n\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced function name extraction from contract call parameters\n * Attempts to decode function selector and map to known function names\n */\n private static extractFunctionName(functionParameters: string): string {\n if (functionParameters.length < 8) return 'unknown';\n\n const selector = functionParameters.substring(0, 8);\n\n const commonSelectors: Record<string, string> = {\n a9059cbb: 'transfer',\n '095ea7b3': 'approve',\n '23b872dd': 'transferFrom',\n '70a08231': 'balanceOf',\n dd62ed3e: 'allowance',\n '18160ddd': 'totalSupply',\n '06fdde03': 'name',\n '95d89b41': 'symbol',\n '313ce567': 'decimals',\n '42842e0e': 'safeTransferFrom',\n b88d4fde: 'safeTransferFrom',\n e985e9c5: 'isApprovedForAll',\n a22cb465: 'setApprovalForAll',\n '6352211e': 'ownerOf',\n c87b56dd: 'tokenURI',\n '01ffc9a7': 'supportsInterface',\n '40c10f19': 'mint',\n '42966c68': 'burn',\n f2fde38b: 'transferOwnership',\n '715018a6': 'renounceOwnership',\n '8da5cb5b': 'owner',\n };\n\n return commonSelectors[selector] || selector;\n }\n\n /**\n * Parse Ethereum Transaction (was completely missing from original parser)\n */\n static parseEthereumTransaction(\n body: proto.IEthereumTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n\n const data: ContractCallData = {\n contractId: 'EVM',\n gas: body.maxGasAllowance\n ? Long.fromValue(body.maxGasAllowance).toNumber()\n : 0,\n amount: 0,\n };\n\n if (body.ethereumData && body.ethereumData.length > 0) {\n const ethData = Buffer.from(body.ethereumData).toString('hex');\n data.functionParameters = ethData;\n\n if (ethData.length >= 8) {\n data.functionName = this.extractFunctionName(ethData);\n }\n }\n\n return data;\n }\n\n static parseContractCall(\n body: proto.IContractCallTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));\n const data: ContractCallData = {\n contractId: new ContractId(\n body.contractID!.shardNum ?? 0,\n body.contractID!.realmNum ?? 0,\n body.contractID!.contractNum ?? 0,\n ).toString(),\n gas: Long.fromValue(body.gas ?? 0).toNumber(),\n amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar)),\n };\n if (body.functionParameters) {\n data.functionParameters = Buffer.from(body.functionParameters).toString(\n 'hex',\n );\n if (data.functionParameters.length >= 8) {\n data.functionName = this.extractFunctionName(data.functionParameters);\n }\n }\n return data;\n }\n\n static parseContractCreate(\n body: proto.IContractCreateTransactionBody,\n ): ContractCreateData | undefined {\n if (!body) return undefined;\n const data: ContractCreateData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.gas) {\n data.gas = Long.fromValue(body.gas).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.constructorParameters) {\n data.constructorParameters = Buffer.from(\n body.constructorParameters,\n ).toString('hex');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n }\n if (body.declineReward !== undefined) {\n data.declineReward = body.declineReward;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\n }\n if (body.fileID) {\n data.initcodeSource = 'fileID';\n data.initcode = new FileId(\n body.fileID.shardNum ?? 0,\n body.fileID.realmNum ?? 0,\n body.fileID.fileNum ?? 0,\n ).toString();\n } else if (body.initcode && body.initcode.length > 0) {\n data.initcodeSource = 'bytes';\n data.initcode = Buffer.from(body.initcode).toString('hex');\n }\n return data;\n }\n\n static parseContractUpdate(\n body: proto.IContractUpdateTransactionBody,\n ): ContractUpdateData | undefined {\n if (!body) return undefined;\n const data: ContractUpdateData = {};\n if (body.contractID) {\n data.contractIdToUpdate = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n\n if (body.memo) {\n const memoUnion = body.memo as unknown;\n if (\n memoUnion &&\n typeof memoUnion === 'object' &&\n Object.prototype.hasOwnProperty.call(memoUnion, 'value')\n ) {\n const value = (memoUnion as { value: unknown }).value;\n if (value === null || value === undefined) {\n data.memo = undefined;\n } else {\n data.memo = String(value);\n }\n } else if (typeof memoUnion === 'string') {\n data.memo = memoUnion;\n } else {\n data.memo = undefined;\n }\n } else {\n data.memo = undefined;\n }\n\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n data.stakedNodeId = undefined;\n } else if (\n body.stakedNodeId !== null &&\n body.stakedNodeId !== undefined &&\n Long.fromValue(body.stakedNodeId).notEquals(-1)\n ) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedNodeId = undefined;\n data.stakedAccountId = undefined;\n }\n if (body.declineReward?.value !== undefined) {\n data.declineReward = body.declineReward.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\n }\n if (body.autoRenewAccountId) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccountId.shardNum ?? 0,\n body.autoRenewAccountId.realmNum ?? 0,\n body.autoRenewAccountId.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseContractDelete(\n body: proto.IContractDeleteTransactionBody,\n ): ContractDeleteData | undefined {\n if (!body) return undefined;\n const data: ContractDeleteData = {};\n if (body.contractID) {\n data.contractIdToDelete = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.transferAccountID) {\n data.transferAccountId = new AccountId(\n body.transferAccountID.shardNum ?? 0,\n body.transferAccountID.realmNum ?? 0,\n body.transferAccountID.accountNum ?? 0,\n ).toString();\n } else if (body.transferContractID) {\n data.transferContractId = new ContractId(\n body.transferContractID.shardNum ?? 0,\n body.transferContractID.realmNum ?? 0,\n body.transferContractID.contractNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n /**\n * Parse SCS (Smart Contract Service) transaction from Transaction object\n * This is the unified entry point that delegates to the comprehensive parsing logic\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n return this.parseSCSTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}
|