@exodus/solana-lib 3.22.1 → 3.22.2

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/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.22.2](https://github.com/ExodusMovement/assets/compare/@exodus/solana-lib@3.22.1...@exodus/solana-lib@3.22.2) (2026-03-27)
7
+
8
+ **Note:** Version bump only for package @exodus/solana-lib
9
+
10
+
11
+
12
+
13
+
6
14
  ## [3.22.1](https://github.com/ExodusMovement/assets/compare/@exodus/solana-lib@3.22.0...@exodus/solana-lib@3.22.1) (2026-03-18)
7
15
 
8
16
  **Note:** Version bump only for package @exodus/solana-lib
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/solana-lib",
3
- "version": "3.22.1",
3
+ "version": "3.22.2",
4
4
  "description": "Solana utils, such as for cryptography, address encoding/decoding, transaction building, etc.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -48,5 +48,5 @@
48
48
  "type": "git",
49
49
  "url": "git+https://github.com/ExodusMovement/assets.git"
50
50
  },
51
- "gitHead": "e746a88ef78a0e7167587bfa14068ceb494d6fd7"
51
+ "gitHead": "07a8157aec179f656835db50568127788d4b91b6"
52
52
  }
package/src/constants.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import {
2
+ ComputeBudgetProgram,
2
3
  PublicKey,
3
4
  StakeProgram,
4
5
  SystemProgram,
@@ -15,9 +16,7 @@ export const STAKE_PROGRAM_ID = StakeProgram.programId
15
16
 
16
17
  export const TOKEN_PROGRAM_ID = TokenProgram.programId
17
18
 
18
- export const COMPUTE_BUDGET_PROGRAM_ID = new PublicKey(
19
- 'ComputeBudget111111111111111111111111111111'
20
- )
19
+ export const COMPUTE_BUDGET_PROGRAM_ID = ComputeBudgetProgram.programId
21
20
 
22
21
  export const TOKEN_2022_PROGRAM_ID = Token2022Program.programId
23
22
 
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  COMPUTE_BUDGET_PROGRAM_ID,
3
+ SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID,
3
4
  SYSTEM_PROGRAM_ID,
4
5
  TOKEN_2022_PROGRAM_ID,
5
6
  TOKEN_PROGRAM_ID,
@@ -62,10 +63,20 @@ export function hasValidShape(instruction, reqs) {
62
63
  )
63
64
  }
64
65
 
65
- export function isTokenProgramInstruction(instruction) {
66
- const programId = instruction?.programId
66
+ export function isTokenProgram(programId) {
67
67
  if (!programId) return false
68
- return programId.equals(TOKEN_PROGRAM_ID) || programId.equals(TOKEN_2022_PROGRAM_ID)
68
+ const id = programId.toString()
69
+ return id === TOKEN_PROGRAM_ID.toString() || id === TOKEN_2022_PROGRAM_ID.toString()
70
+ }
71
+
72
+ export function isATAProgram(programId) {
73
+ if (!programId) return false
74
+ return programId.toString() === SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID.toString()
75
+ }
76
+
77
+ /** @deprecated Use `isTokenProgram(instruction.programId)` instead. */
78
+ export function isTokenProgramInstruction(instruction) {
79
+ return isTokenProgram(instruction?.programId)
69
80
  }
70
81
 
71
82
  export function isSystemTransferInstruction(instruction) {
@@ -81,14 +92,18 @@ export function isSystemTransferInstruction(instruction) {
81
92
  }
82
93
  }
83
94
 
84
- export function isComputeBudgetInstruction(instruction) {
85
- const programId = instruction?.programId
95
+ export function isComputeBudgetProgram(programId) {
86
96
  if (!programId) return false
87
- return programId.equals(COMPUTE_BUDGET_PROGRAM_ID)
97
+ return programId.toString() === COMPUTE_BUDGET_PROGRAM_ID.toString()
98
+ }
99
+
100
+ /** @deprecated Use `isComputeBudgetProgram(instruction.programId)` instead. */
101
+ export function isComputeBudgetInstruction(instruction) {
102
+ return isComputeBudgetProgram(instruction?.programId)
88
103
  }
89
104
 
90
105
  export function isSetAuthorityInstruction(instruction) {
91
- if (!isTokenProgramInstruction(instruction)) return false
106
+ if (!isTokenProgram(instruction?.programId)) return false
92
107
  const reqs = TOKEN_INSTRUCTION_REQUIREMENTS[TOKEN_INSTRUCTION_LAYOUTS.SetAuthority.index]
93
108
  if (!hasValidShape(instruction, reqs)) return false
94
109
  const buffer = toBuffer(instruction.data)
@@ -96,7 +111,7 @@ export function isSetAuthorityInstruction(instruction) {
96
111
  }
97
112
 
98
113
  export function isTransferInstruction(instruction) {
99
- if (!isTokenProgramInstruction(instruction)) return false
114
+ if (!isTokenProgram(instruction?.programId)) return false
100
115
  const reqs = TOKEN_INSTRUCTION_REQUIREMENTS[TOKEN_INSTRUCTION_LAYOUTS.Transfer.index]
101
116
  if (!hasValidShape(instruction, reqs)) return false
102
117
  const buffer = toBuffer(instruction.data)
@@ -104,7 +119,7 @@ export function isTransferInstruction(instruction) {
104
119
  }
105
120
 
106
121
  export function isTransferCheckedInstruction(instruction) {
107
- if (!isTokenProgramInstruction(instruction)) return false
122
+ if (!isTokenProgram(instruction?.programId)) return false
108
123
  const reqs = TOKEN_INSTRUCTION_REQUIREMENTS[TOKEN_INSTRUCTION_LAYOUTS.TransferChecked.index]
109
124
  if (!hasValidShape(instruction, reqs)) return false
110
125
  const buffer = toBuffer(instruction.data)
@@ -112,7 +127,7 @@ export function isTransferCheckedInstruction(instruction) {
112
127
  }
113
128
 
114
129
  export function isTransferCheckedWithFeeInstruction(instruction) {
115
- if (!isTokenProgramInstruction(instruction)) return false
130
+ if (!isTokenProgram(instruction?.programId)) return false
116
131
  const reqs = TOKEN_INSTRUCTION_REQUIREMENTS[TOKEN_INSTRUCTION_LAYOUTS.TransferFeeExtension.index]
117
132
  if (!hasValidShape(instruction, reqs)) return false
118
133
  const buffer = toBuffer(instruction.data)
@@ -2,13 +2,13 @@ import lodash from 'lodash'
2
2
  import assert from 'minimalistic-assert'
3
3
 
4
4
  import {
5
+ SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID,
5
6
  SPL_TOKEN_AUTHORITY_TYPE,
6
7
  SPL_TOKEN_INSTRUCTION_TYPE,
7
- TOKEN_2022_PROGRAM_ID,
8
8
  TOKEN_PROGRAM_ID,
9
9
  } from '../constants.js'
10
- import { ASSOCIATED_TOKEN_PROGRAM_ID } from '../helpers/spl-token.js'
11
10
  import { SYSVAR_RENT_PUBKEY } from '../vendor/index.js'
11
+ import { isATAProgram, isTokenProgram } from './instruction-utils.js'
12
12
 
13
13
  export function verifyOnlyFeePayerChanged(beforeTx, afterTx) {
14
14
  assert(
@@ -72,7 +72,7 @@ export function verifyOnlyFeePayerChanged(beforeTx, afterTx) {
72
72
  return keyStr === SYSVAR_RENT_PUBKEY.toString()
73
73
  })
74
74
 
75
- if (containsRentSysvar && isATAProgram(programId)) {
75
+ if (containsRentSysvar && (isATAProgram(programId) || isTokenProgram(programId))) {
76
76
  const adjustedBeforeAccounts = [...beforeAccounts]
77
77
  adjustedBeforeAccounts[0] = afterTx.message.accountKeys[0]
78
78
  assert(
@@ -237,19 +237,6 @@ export function verifyOnlyFeePayerChanged(beforeTx, afterTx) {
237
237
  )
238
238
  }
239
239
 
240
- function isTokenProgram(programId) {
241
- const programIdStr = programId.toString()
242
- return (
243
- programIdStr === TOKEN_PROGRAM_ID.toString() ||
244
- programIdStr === TOKEN_2022_PROGRAM_ID.toString()
245
- )
246
- }
247
-
248
- function isATAProgram(programId) {
249
- const programIdStr = programId.toString()
250
- return isTokenProgram(programId) || programIdStr === ASSOCIATED_TOKEN_PROGRAM_ID.toString()
251
- }
252
-
253
240
  function getTokenAccountCreations(transaction) {
254
241
  const createdAccounts = []
255
242
 
@@ -258,7 +245,7 @@ function getTokenAccountCreations(transaction) {
258
245
 
259
246
  // Check for ATA creation (Associated Token Account Program)
260
247
  if (
261
- programId === ASSOCIATED_TOKEN_PROGRAM_ID.toString() && // For ATA creation, the new account is typically at index 1
248
+ programId === SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID.toString() && // For ATA creation, the new account is typically at index 1
262
249
  // Index 0 is payer, Index 1 is the ATA being created, Index 5 is the token program
263
250
  instruction.accounts?.length >= 2
264
251
  ) {