@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 +8 -0
- package/package.json +2 -2
- package/src/constants.js +2 -3
- package/src/tx/instruction-utils.js +25 -10
- package/src/tx/verify-only-fee-payer-changed.js +4 -17
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.
|
|
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": "
|
|
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 =
|
|
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
|
|
66
|
-
const programId = instruction?.programId
|
|
66
|
+
export function isTokenProgram(programId) {
|
|
67
67
|
if (!programId) return false
|
|
68
|
-
|
|
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
|
|
85
|
-
const programId = instruction?.programId
|
|
95
|
+
export function isComputeBudgetProgram(programId) {
|
|
86
96
|
if (!programId) return false
|
|
87
|
-
return programId.
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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 ===
|
|
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
|
) {
|