@helium/sus 0.6.24-next.3

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,533 @@
1
+ import { BorshAccountsCoder, BorshInstructionCoder, } from "@coral-xyz/anchor";
2
+ import { decodeIdlAccount } from "@coral-xyz/anchor/dist/cjs/idl";
3
+ import { utf8 } from "@coral-xyz/anchor/dist/cjs/utils/bytes";
4
+ import { getLeafAssetId } from "@metaplex-foundation/mpl-bubblegum";
5
+ import { PROGRAM_ID as MPL_PID, Metadata, } from "@metaplex-foundation/mpl-token-metadata";
6
+ import { sha256 } from "@noble/hashes/sha256";
7
+ import { NATIVE_MINT, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, unpackAccount, unpackMint, unpackMultisig, } from "@solana/spl-token";
8
+ import { PublicKey, SystemProgram, VersionedTransaction, } from "@solana/web3.js";
9
+ import axios from "axios";
10
+ import { inflate } from "pako";
11
+ const BUBBLEGUM_PROGRAM_ID = new PublicKey("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY");
12
+ const ACCOUNT_COMPRESSION_PROGRAM_ID = new PublicKey("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK");
13
+ export async function sus({ connection, wallet, serializedTransaction,
14
+ /// CNFT specific params
15
+ checkCNfts = false, extraSearchAssetParams, cNfts,
16
+ // Cluster for explorer
17
+ cluster = "mainnet-beta", }) {
18
+ const warnings = [];
19
+ const transaction = VersionedTransaction.deserialize(serializedTransaction);
20
+ const message = transaction.message.serialize().toString("base64");
21
+ const explorerLink = `https://explorer.solana.com/tx/inspector?cluster=${cluster}&message=${encodeURIComponent(message)}`;
22
+ const addressLookupTableAccounts = [];
23
+ const { addressTableLookups } = transaction.message;
24
+ if (addressTableLookups.length > 0) {
25
+ // eslint-disable-next-line no-restricted-syntax
26
+ for (const addressTableLookup of addressTableLookups) {
27
+ // eslint-disable-next-line no-await-in-loop
28
+ const result = await connection?.getAddressLookupTable(addressTableLookup.accountKey);
29
+ if (result?.value) {
30
+ addressLookupTableAccounts.push(result?.value);
31
+ }
32
+ }
33
+ }
34
+ const accountKeys = transaction.message.getAccountKeys({
35
+ addressLookupTableAccounts,
36
+ });
37
+ const simulationAccounts = [
38
+ ...new Set(accountKeys.staticAccountKeys
39
+ .filter((_, index) => transaction.message.isAccountWritable(index))
40
+ .concat(accountKeys.accountKeysFromLookups
41
+ ? // Only writable accounts will contribute to balance changes
42
+ accountKeys.accountKeysFromLookups.writable
43
+ : [])),
44
+ ];
45
+ const fetchedAccounts = await connection.getMultipleAccountsInfo(simulationAccounts);
46
+ const { blockhash } = await connection?.getLatestBlockhash();
47
+ transaction.message.recentBlockhash = blockhash;
48
+ const simulatedTxn = await connection?.simulateTransaction(transaction, {
49
+ accounts: {
50
+ encoding: "base64",
51
+ addresses: simulationAccounts?.map((account) => account.toBase58()) || [],
52
+ },
53
+ });
54
+ const fullAccounts = simulationAccounts.map((account, index) => ({
55
+ address: account,
56
+ post: simulatedTxn.value.accounts?.[index],
57
+ pre: fetchedAccounts[index],
58
+ }));
59
+ const programKeys = fullAccounts
60
+ .map((acc) => acc?.pre?.owner || (acc.post ? new PublicKey(acc.post.owner) : null))
61
+ .concat(...transaction.message.compiledInstructions.map((ix) => accountKeys.get(ix.programIdIndex) || null))
62
+ .filter(truthy);
63
+ const idlKeys = programKeys.map(getIdlKey);
64
+ const idls = (await connection.getMultipleAccountsInfo(idlKeys))
65
+ .map((acc, index) => {
66
+ if (acc) {
67
+ return {
68
+ program: programKeys[index],
69
+ idl: decodeIdl(acc),
70
+ };
71
+ }
72
+ })
73
+ .filter(truthy)
74
+ .reduce((acc, { program, idl }) => {
75
+ if (idl) {
76
+ acc[program.toBase58()] = idl;
77
+ }
78
+ return acc;
79
+ }, {});
80
+ const writableAccounts = await getDetailedWritableAccounts({
81
+ connection,
82
+ accounts: fullAccounts,
83
+ idls,
84
+ });
85
+ const instructions = await parseInstructions({
86
+ idls,
87
+ instructions: transaction.message.compiledInstructions.map((ix) => ({
88
+ data: Buffer.from(ix.data),
89
+ programId: accountKeys.get(ix.programIdIndex),
90
+ accounts: ix.accountKeyIndexes.map((ix) => ({
91
+ pubkey: accountKeys.get(ix),
92
+ isSigner: transaction.message.isAccountSigner(ix),
93
+ isWritable: transaction.message.isAccountWritable(ix),
94
+ })),
95
+ })),
96
+ });
97
+ if (instructions.some((ix) => ix.parsed?.name === "ledgerTransferPositionV0")) {
98
+ warnings.push({
99
+ severity: 'critical',
100
+ shortMessage: 'Theft of Locked HNT',
101
+ message: "This transaction is attempting to steal your locked HNT positions"
102
+ });
103
+ }
104
+ if (instructions.some((ix) => isBurnHotspot(connection, ix))) {
105
+ warnings.push({
106
+ severity: 'critical',
107
+ shortMessage: 'Hotspot Destroyed',
108
+ message: "This transaction will brick your Hotspot!"
109
+ });
110
+ }
111
+ const logs = simulatedTxn.value.logs;
112
+ if (simulatedTxn?.value.err) {
113
+ if (isInsufficientBal(simulatedTxn?.value.err)) {
114
+ warnings.push({
115
+ severity: 'warning',
116
+ shortMessage: 'Simulation Failed',
117
+ message: "Transaction failed in simulation"
118
+ });
119
+ return {
120
+ instructions,
121
+ error: simulatedTxn.value.err,
122
+ logs,
123
+ solFee: 0,
124
+ priorityFee: 0,
125
+ insufficientFunds: true,
126
+ explorerLink,
127
+ balanceChanges: [],
128
+ possibleCNftChanges: [],
129
+ writableAccounts,
130
+ rawSimulation: simulatedTxn.value,
131
+ warnings,
132
+ };
133
+ }
134
+ }
135
+ let solFee = (transaction?.signatures.length || 1) * 5000;
136
+ let priorityFee = 0;
137
+ const fee = (await connection?.getFeeForMessage(transaction.message, "confirmed"))
138
+ .value || solFee;
139
+ priorityFee = fee - solFee;
140
+ const balanceChanges = writableAccounts
141
+ .map((acc) => {
142
+ const type = acc.pre.type || acc.post.type;
143
+ switch (type) {
144
+ case "TokenAccount":
145
+ if (acc.post.parsed?.delegate && !acc.pre.parsed?.delegate) {
146
+ warnings.push({
147
+ severity: 'warning',
148
+ shortMessage: 'Withdraw Authority Given',
149
+ message: `Delegation was taken on ${acc.name}. This gives permission to withdraw tokens without the owner's permission.`
150
+ });
151
+ }
152
+ if (acc.post.parsed && acc.pre.parsed && !acc.post.parsed.owner.equals(acc.pre.parsed.owner)) {
153
+ warnings.push({
154
+ severity: 'warning',
155
+ shortMessage: 'Account Owner Changed',
156
+ message: `The owner of ${acc.name} changed from ${acc.pre.parsed?.owner} to ${acc.post.parsed?.owner}`
157
+ });
158
+ }
159
+ return {
160
+ owner: acc.post.parsed?.owner || acc.pre.parsed?.owner,
161
+ address: acc.address,
162
+ amount: (acc.post.parsed?.amount || BigInt(0)) -
163
+ (acc.pre.parsed?.amount || BigInt(0)),
164
+ metadata: acc.metadata,
165
+ };
166
+ case "NativeAccount":
167
+ return {
168
+ owner: acc.address,
169
+ address: acc.address,
170
+ amount: BigInt((acc.post.account?.lamports || 0) -
171
+ (acc.pre.account?.lamports || 0)),
172
+ metadata: {
173
+ mint: NATIVE_MINT,
174
+ decimals: 9,
175
+ name: "SOL",
176
+ symbol: "SOL",
177
+ },
178
+ };
179
+ default:
180
+ return null;
181
+ }
182
+ })
183
+ .filter(truthy);
184
+ if (balanceChanges.filter((b) => b.owner.equals(wallet) && b.amount < BigInt(0))
185
+ .length > 2) {
186
+ warnings.push({
187
+ severity: 'warning',
188
+ shortMessage: 'Potential Drain Risk',
189
+ message: "More than 2 accounts with negative balance change. Is this emptying your wallet?"
190
+ });
191
+ }
192
+ let possibleCNftChanges = [];
193
+ if (checkCNfts) {
194
+ let assets = cNfts;
195
+ if (!assets) {
196
+ const assetsResponse = await axios.post(connection.rpcEndpoint, {
197
+ jsonrpc: "2.0",
198
+ method: "searchAssets",
199
+ id: "get-assets-op-1",
200
+ params: {
201
+ page: 1,
202
+ // limit to checking 200 assets
203
+ limit: 200,
204
+ compressed: true,
205
+ ...extraSearchAssetParams,
206
+ },
207
+ headers: {
208
+ "Cache-Control": "no-cache",
209
+ Pragma: "no-cache",
210
+ Expires: "0",
211
+ },
212
+ });
213
+ assets = assetsResponse.data.result?.items;
214
+ }
215
+ const possibleMerkles = new Set(writableAccounts
216
+ .filter((acc) => acc.name === "Merkle Tree")
217
+ .map((a) => a.address.toBase58()));
218
+ possibleCNftChanges = (assets || []).filter((item) => item.compression.tree && possibleMerkles.has(item.compression.tree));
219
+ }
220
+ return {
221
+ instructions,
222
+ logs,
223
+ solFee,
224
+ priorityFee,
225
+ insufficientFunds: false,
226
+ explorerLink,
227
+ balanceChanges,
228
+ possibleCNftChanges,
229
+ writableAccounts,
230
+ rawSimulation: simulatedTxn.value,
231
+ warnings,
232
+ };
233
+ }
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
235
+ export function isInsufficientBal(e) {
236
+ return (e.toString().includes("Insufficient Balance") ||
237
+ e.toString().includes('"Custom":1') ||
238
+ e.InstructionError?.[1]?.Custom === 1);
239
+ }
240
+ async function parseInstructions({ idls, instructions, }) {
241
+ return instructions.map((ix) => {
242
+ const idl = idls[ix.programId.toBase58()];
243
+ if (idl) {
244
+ try {
245
+ const coder = new BorshInstructionCoder(idl);
246
+ const parsed = coder.decode(ix.data, "base58");
247
+ if (parsed) {
248
+ const formatted = coder.format(parsed, ix.accounts);
249
+ if (formatted) {
250
+ return {
251
+ parsed: {
252
+ name: parsed.name,
253
+ data: parsed.data,
254
+ accounts: formatted.accounts,
255
+ },
256
+ raw: ix,
257
+ };
258
+ }
259
+ }
260
+ }
261
+ catch (e) {
262
+ // Ignore, not a valid ix
263
+ }
264
+ }
265
+ return { raw: ix };
266
+ });
267
+ }
268
+ function getIdlKey(programId) {
269
+ const base = PublicKey.findProgramAddressSync([], programId)[0];
270
+ const buffer = Buffer.concat([
271
+ base.toBuffer(),
272
+ Buffer.from("anchor:idl"),
273
+ programId.toBuffer(),
274
+ ]);
275
+ const publicKeyBytes = sha256(buffer);
276
+ return new PublicKey(publicKeyBytes);
277
+ }
278
+ function decodeIdl(account) {
279
+ try {
280
+ const idlData = decodeIdlAccount(Buffer.from(account.data.subarray(8)));
281
+ const inflatedIdl = inflate(idlData.data);
282
+ return JSON.parse(utf8.decode(inflatedIdl));
283
+ }
284
+ catch (e) {
285
+ // Ignore, not a valid IDL
286
+ }
287
+ }
288
+ export async function getDetailedWritableAccounts({ connection, accounts, idls, }) {
289
+ const uniqueTokens = new Set();
290
+ const withoutMetadata = accounts.map(({ address, pre, post }) => {
291
+ let name = "Unknown";
292
+ let type = "Unknown";
293
+ let preParsed = null;
294
+ let postParsed = null;
295
+ let accountOwner = undefined;
296
+ const postData = post &&
297
+ Buffer.from(
298
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
299
+ post.data[0],
300
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
301
+ post.data[1]);
302
+ const postAccount = post && postData
303
+ ? {
304
+ executable: post.executable,
305
+ owner: new PublicKey(post.owner),
306
+ lamports: post.lamports,
307
+ data: postData,
308
+ rentEpoch: post.rentEpoch,
309
+ }
310
+ : null;
311
+ const owner = pre?.owner || (post ? new PublicKey(post.owner) : null);
312
+ switch (owner?.toBase58()) {
313
+ case ACCOUNT_COMPRESSION_PROGRAM_ID.toBase58():
314
+ name = "Merkle Tree";
315
+ type = "MerkleTree";
316
+ break;
317
+ case SystemProgram.programId.toBase58():
318
+ name = "Native SOL Account";
319
+ type = "NativeAccount";
320
+ accountOwner = address;
321
+ break;
322
+ case TOKEN_2022_PROGRAM_ID.toBase58():
323
+ ({ parsed: preParsed, type } = decodeTokenStruct(address, pre, TOKEN_2022_PROGRAM_ID) || { type: "Unknown Token Program" });
324
+ ({ parsed: postParsed, type } = decodeTokenStruct(address, postAccount, TOKEN_2022_PROGRAM_ID) || { type: "Unknown Token Program" });
325
+ break;
326
+ case TOKEN_PROGRAM_ID.toBase58():
327
+ ({ parsed: preParsed, type } = decodeTokenStruct(address, pre, TOKEN_PROGRAM_ID) || { type: "Unknown Token Program" });
328
+ ({ parsed: postParsed, type } = decodeTokenStruct(address, postAccount, TOKEN_PROGRAM_ID) || { type: "Unknown Token Program" });
329
+ break;
330
+ default:
331
+ if (owner) {
332
+ const idl = idls[owner.toBase58()];
333
+ if (idl) {
334
+ ({ parsed: preParsed, type } = decodeIdlStruct(idl, pre) || {
335
+ type: "No Published IDL",
336
+ });
337
+ ({ parsed: postParsed, type } = decodeIdlStruct(idl, postAccount) || {
338
+ type: "No Published IDL",
339
+ });
340
+ name = type;
341
+ }
342
+ }
343
+ break;
344
+ }
345
+ // If token, get the name based on the metadata
346
+ if (new Set([
347
+ TOKEN_2022_PROGRAM_ID.toBase58(),
348
+ TOKEN_PROGRAM_ID.toBase58(),
349
+ ]).has(owner?.toBase58() || "")) {
350
+ if (type === "Mint") {
351
+ uniqueTokens.add(address.toBase58());
352
+ }
353
+ else if (type === "TokenAccount") {
354
+ const mint = (preParsed?.mint || postParsed?.mint).toBase58();
355
+ accountOwner = preParsed?.owner || postParsed?.owner;
356
+ uniqueTokens.add(mint);
357
+ }
358
+ }
359
+ return {
360
+ address,
361
+ name,
362
+ owner: accountOwner,
363
+ pre: {
364
+ type,
365
+ account: pre || null,
366
+ parsed: preParsed,
367
+ },
368
+ post: {
369
+ type,
370
+ account: post || null,
371
+ parsed: postParsed,
372
+ },
373
+ changedInSimulation: pre && postData
374
+ ? !pre.data.equals(postData) ||
375
+ pre.lamports != post.lamports ||
376
+ !pre.owner.equals(new PublicKey(post.owner))
377
+ : true,
378
+ };
379
+ });
380
+ const tokens = [...uniqueTokens].map((t) => new PublicKey(t));
381
+ const metadatas = (await fetchMetadatas(connection, tokens)).reduce((acc, m, index) => {
382
+ if (m) {
383
+ acc[tokens[index].toBase58()] = m;
384
+ }
385
+ return acc;
386
+ }, {});
387
+ return withoutMetadata.map((acc) => {
388
+ let name = acc.name;
389
+ let metadata;
390
+ const type = acc.pre.type || acc.post.type;
391
+ // If token, get the name based on the metadata
392
+ if (type === "Mint") {
393
+ metadata = metadatas[acc.address.toBase58()];
394
+ if (metadata) {
395
+ name = `${metadata.symbol} Mint`;
396
+ }
397
+ else {
398
+ name = `Unknown Mint`;
399
+ }
400
+ }
401
+ else if (type === "TokenAccount") {
402
+ metadata =
403
+ metadatas[(acc.pre.parsed?.mint || acc.post.parsed?.mint).toBase58()];
404
+ if (metadata) {
405
+ name = `${metadata.symbol} Token Account`;
406
+ }
407
+ else {
408
+ name = `Unknown Token Account`;
409
+ }
410
+ }
411
+ return {
412
+ ...acc,
413
+ name,
414
+ metadata,
415
+ };
416
+ });
417
+ }
418
+ function decodeIdlStruct(idl, account) {
419
+ if (!account) {
420
+ return null;
421
+ }
422
+ try {
423
+ const coder = new BorshAccountsCoder(idl);
424
+ const descriminator = account.data.slice(0, 8);
425
+ const type = idl.accounts?.find((account) => BorshAccountsCoder.accountDiscriminator(account.name).equals(descriminator))?.name;
426
+ if (type) {
427
+ return {
428
+ type,
429
+ parsed: coder.decode(type, account.data),
430
+ };
431
+ }
432
+ }
433
+ catch (e) {
434
+ // Ignore, not a valid account
435
+ }
436
+ return null;
437
+ }
438
+ function decodeTokenStruct(address, account, programId) {
439
+ if (!account) {
440
+ return null;
441
+ }
442
+ try {
443
+ return {
444
+ type: "TokenAccount",
445
+ parsed: unpackAccount(address, account, programId),
446
+ };
447
+ }
448
+ catch (e) {
449
+ // Not an account
450
+ }
451
+ try {
452
+ return {
453
+ type: "Mint",
454
+ parsed: unpackMint(address, account, programId),
455
+ };
456
+ }
457
+ catch (e) {
458
+ // Not an account
459
+ }
460
+ try {
461
+ return {
462
+ type: "Multisig",
463
+ parsed: unpackMultisig(address, account, programId),
464
+ };
465
+ }
466
+ catch (e) {
467
+ // Not an account
468
+ }
469
+ return null;
470
+ }
471
+ export function getMetadataId(mint) {
472
+ return PublicKey.findProgramAddressSync([Buffer.from("metadata", "utf-8"), MPL_PID.toBuffer(), mint.toBuffer()], MPL_PID)[0];
473
+ }
474
+ export async function fetchMetadatas(connection, tokens) {
475
+ const metadatas = tokens.map(getMetadataId);
476
+ const all = await connection.getMultipleAccountsInfo([
477
+ ...metadatas,
478
+ ...tokens,
479
+ ]);
480
+ const metadataAccounts = all.slice(0, metadatas.length);
481
+ const mintAccounts = all.slice(metadatas.length, metadatas.length * 2);
482
+ return metadataAccounts.map((acc, index) => {
483
+ const mint = unpackMint(tokens[index], mintAccounts[index]);
484
+ if (acc) {
485
+ const collectable = Metadata.fromAccountInfo(acc)[0];
486
+ return {
487
+ name: collectable.data.name.replace(/\0/g, ""),
488
+ symbol: collectable.data.symbol.replace(/\0/g, ""),
489
+ uri: collectable.data.uri.replace(/\0/g, ""),
490
+ decimals: mint.decimals,
491
+ mint: tokens[index],
492
+ };
493
+ }
494
+ return {
495
+ mint: tokens[index],
496
+ decimals: mint.decimals,
497
+ };
498
+ });
499
+ }
500
+ const truthy = (value) => !!value;
501
+ async function isBurnHotspot(connection, ix) {
502
+ if (ix.raw.programId.equals(BUBBLEGUM_PROGRAM_ID) &&
503
+ ix.parsed?.name === "burn") {
504
+ const tree = ix.parsed?.accounts.find((acc) => acc.name === "merkleTree")?.pubkey;
505
+ if (tree) {
506
+ const assetId = await getLeafAssetId(tree, ix.parsed?.data[4]);
507
+ const assetResponse = await axios.post(connection.rpcEndpoint, {
508
+ jsonrpc: "2.0",
509
+ method: "getAsset",
510
+ id: "get-asset-op-1",
511
+ params: {
512
+ id: assetId.toBase58(),
513
+ },
514
+ headers: {
515
+ "Cache-Control": "no-cache",
516
+ Pragma: "no-cache",
517
+ Expires: "0",
518
+ },
519
+ });
520
+ const asset = assetResponse.data.result;
521
+ return (asset &&
522
+ asset.creators[0]?.address == HELIUM_ENTITY_CREATOR.toBase58() &&
523
+ asset.creators[0]?.verified);
524
+ }
525
+ }
526
+ return false;
527
+ }
528
+ const DAO = PublicKey.findProgramAddressSync([
529
+ Buffer.from("dao", "utf-8"),
530
+ new PublicKey("hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux").toBuffer(),
531
+ ], new PublicKey("hdaoVTCqhfHHo75XdAMxBKdUqvq1i5bF23sisBqVgGR"))[0];
532
+ const HELIUM_ENTITY_CREATOR = PublicKey.findProgramAddressSync([Buffer.from("entity_creator", "utf-8"), DAO.toBuffer()], new PublicKey("hemjuPXBpNvggtaUnN1MwT3wrdhttKEfosTcc2P9Pg8"))[0];
533
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}