@exodus/solana-api 3.27.3 → 3.27.5

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,24 @@
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.27.5](https://github.com/ExodusMovement/assets/compare/@exodus/solana-api@3.27.4...@exodus/solana-api@3.27.5) (2026-01-19)
7
+
8
+ **Note:** Version bump only for package @exodus/solana-api
9
+
10
+
11
+
12
+
13
+
14
+ ## [3.27.4](https://github.com/ExodusMovement/assets/compare/@exodus/solana-api@3.27.3...@exodus/solana-api@3.27.4) (2026-01-15)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+
20
+ * fix: SOL unconfirmed withdrawable balance (#7274)
21
+
22
+
23
+
6
24
  ## [3.27.3](https://github.com/ExodusMovement/assets/compare/@exodus/solana-api@3.27.2...@exodus/solana-api@3.27.3) (2026-01-13)
7
25
 
8
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/solana-api",
3
- "version": "3.27.3",
3
+ "version": "3.27.5",
4
4
  "description": "Transaction monitors, fee monitors, RPC with the blockchain node, and other networking code for Solana",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -49,7 +49,7 @@
49
49
  "@exodus/assets-testing": "^1.0.0",
50
50
  "@exodus/solana-web3.js": "^1.63.1-exodus.9-rc3"
51
51
  },
52
- "gitHead": "ecc849a8b24d0d0f5518437dc58d3fb943a2a1cd",
52
+ "gitHead": "7b4ab87737c74a125365ae729af09dff9779b7f0",
53
53
  "bugs": {
54
54
  "url": "https://github.com/ExodusMovement/assets/issues?q=is%3Aissue+is%3Aopen+label%3Asolana-api"
55
55
  },
package/src/connection.js CHANGED
@@ -5,7 +5,7 @@ import assert from 'minimalistic-assert'
5
5
  import ms from 'ms'
6
6
 
7
7
  const DEFAULT_RECONNECT_DELAY = ms('15s')
8
- const PING_INTERVAL = ms('30s')
8
+ const PING_INTERVAL = ms('25s')
9
9
 
10
10
  const debug = debugLogger('exodus:solana-api')
11
11
 
@@ -113,6 +113,7 @@ const fixBalances = ({
113
113
  activating = activating.add(stakeAmount.abs())
114
114
  break
115
115
  case 'withdraw':
116
+ unconfirmedSent = unconfirmedSent.add(withdrawable)
116
117
  withdrawable = asset.currency.ZERO
117
118
  break
118
119
  case 'undelegate':
package/src/ws-api.js CHANGED
@@ -5,8 +5,10 @@ import { Connection } from './connection.js'
5
5
  import { parseTransaction } from './tx-parser.js'
6
6
  import { isSolAddressPoisoningTx } from './txs-utils.js'
7
7
 
8
+ // Triton Whirligig WebSocket
9
+ const WS_ENDPOINT = 'wss://solana-triton.a.exodus.io/whirligig' // pointing to: wss://exodus-solanama-6db3.mainnet.rpcpool.com/<token>/whirligig
8
10
  // Helius Advanced WebSocket
9
- const WS_ENDPOINT = 'wss://solana-helius-wss.a.exodus.io/ws' // pointing to: wss://atlas-mainnet.helius-rpc.com/?api-key=<API_KEY>
11
+ // const WS_ENDPOINT = 'wss://solana-helius-wss.a.exodus.io/ws' // pointing to: wss://atlas-mainnet.helius-rpc.com/?api-key=<API_KEY>
10
12
 
11
13
  export class WsApi {
12
14
  constructor({ rpcUrl, wsUrl, assets }) {
@@ -88,7 +90,10 @@ export class WsApi {
88
90
  {
89
91
  vote: false,
90
92
  // failed: true,
91
- accountInclude: addresses,
93
+ accounts: {
94
+ include: addresses,
95
+ },
96
+ // accountInclude: addresses, // Helius
92
97
  },
93
98
  {
94
99
  commitment: 'confirmed',
@@ -147,7 +152,8 @@ export class WsApi {
147
152
  tokenAccountsByOwner,
148
153
  result,
149
154
  }) {
150
- const parsedTx = parseTransaction(address, result.transaction, tokenAccountsByOwner)
155
+ const rawTransaction = result?.value ? result.value.transaction : result.transaction // for Triton Whirligig OR Helius Advanced WS
156
+ const parsedTx = parseTransaction(address, rawTransaction, tokenAccountsByOwner)
151
157
  const timestamp = Date.now() // the notification event has no blockTime
152
158
 
153
159
  if (!parsedTx.from && parsedTx.tokenTxs?.length === 0) return { logItemsByAsset: {} } // cannot parse it