@exodus/ethereum-api 10.1.0 → 10.1.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,25 @@
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
+ ## [10.1.2](https://github.com/ExodusMovement/assets/compare/@exodus/ethereum-api@10.1.1...@exodus/ethereum-api@10.1.2) (2026-10-17)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **ethereum-api:** do not block ETH unstake when simulation is unavailable ([#8956](https://github.com/ExodusMovement/assets/issues/8956)) ([fee54b6](https://github.com/ExodusMovement/assets/commit/fee54b64b771ba67ba2f8671d545b265c732a5d1)), closes [ExodusMovement/exodus#47093](https://github.com/ExodusMovement/exodus/issues/47093)
12
+ * **ethereum-api:** keep unowned staking snapshot when staking read fails ([#8954](https://github.com/ExodusMovement/assets/issues/8954)) ([9d2a4bd](https://github.com/ExodusMovement/assets/commit/9d2a4bd36ddcc5180f3724354d2a71488d37c22b))
13
+
14
+
15
+
16
+ ## [10.1.1](https://github.com/ExodusMovement/assets/compare/@exodus/ethereum-api@10.1.0...@exodus/ethereum-api@10.1.1) (2026-10-09)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * migrate to @exodus/basic-utils 5 ([#8894](https://github.com/ExodusMovement/assets/issues/8894)) ([ed125f3](https://github.com/ExodusMovement/assets/commit/ed125f3257785c92a3b8f8239a2e9eefe5dc6772))
22
+
23
+
24
+
6
25
  ## [10.1.0](https://github.com/ExodusMovement/assets/compare/@exodus/ethereum-api@10.0.0...@exodus/ethereum-api@10.1.0) (2026-10-05)
7
26
 
8
27
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/ethereum-api",
3
- "version": "10.1.0",
3
+ "version": "10.1.2",
4
4
  "description": "Transaction monitors, fee monitors, RPC with the blockchain node, and other networking code for Ethereum and EVM-based blockchains",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -23,7 +23,7 @@
23
23
  "@exodus/asset": "^2.0.4",
24
24
  "@exodus/asset-lib": "^5.9.2",
25
25
  "@exodus/assets": "^11.4.0",
26
- "@exodus/basic-utils": "^3.0.1",
26
+ "@exodus/basic-utils": "^5.1.0",
27
27
  "@exodus/bip44-constants": "^195.0.0",
28
28
  "@exodus/crypto": "^1.0.0-rc.26",
29
29
  "@exodus/currency": "^6.0.1",
@@ -44,7 +44,6 @@
44
44
  "events": "^1.1.1",
45
45
  "idna-uts46-hx": "^2.3.1",
46
46
  "lodash": "^4.17.15",
47
- "make-concurrent": "^4.0.0",
48
47
  "minimalistic-assert": "^1.0.1",
49
48
  "ms": "^2.1.1",
50
49
  "socket.io-client": "^2.1.1"
@@ -66,5 +65,5 @@
66
65
  "type": "git",
67
66
  "url": "git+https://github.com/ExodusMovement/assets.git"
68
67
  },
69
- "gitHead": "f5c81fc2962e5d2836794149870fb9aaf094ddc9"
68
+ "gitHead": "2efa1324fb981a5c05f2591f1cc6d8b5776ed1fe"
70
69
  }
@@ -150,6 +150,9 @@ export const createEthereumHooks = ({
150
150
  // deadlines. Unknown legacy owners cannot supply failed fields on restore.
151
151
  // Preserve only non-service host metadata when changing snapshot owners.
152
152
  for (const name of new Set([...stakingAssetNames, ...Object.keys(owners)])) {
153
+ // An ownerless legacy snapshot is only replaced once a read succeeds;
154
+ // keep it rather than zeroing staked balances that were never re-read.
155
+ if (!owners[name] && !patches[name]) continue
153
156
  if (owners[name]?.address !== address || owners[name]?.network !== assetName) {
154
157
  staking[name] = Object.fromEntries(
155
158
  Object.entries(staking[name] || {}).filter(([key]) => !STAKING_SNAPSHOT_FIELDS.has(key))
@@ -187,6 +187,11 @@ export const simulateTransactionsApi = async ({
187
187
  headers,
188
188
  })
189
189
  if (!response) {
190
+ // The service could not be reached (network error, timeout, non-2xx), so
191
+ // there is no verdict on these transactions. Callers that must tell an
192
+ // outage apart from a failed simulation check this flag.
193
+ // eslint-disable-next-line @exodus/hydra/no-param-reassign-prop-only
194
+ simulationResult.metadata.simulationUnavailable = true
190
195
  return {
191
196
  kind: 'error',
192
197
  error: SimulationErrorMessages.APICallFailed,
@@ -223,6 +223,18 @@ export async function simulateUndelegateTransactions({
223
223
  transactions,
224
224
  })
225
225
 
226
+ // An unreachable simulation service must not block unstaking: we have no
227
+ // verdict, so neither check below can tell us anything about the txs.
228
+ // `simulationUnavailable` is set only when the request to the service
229
+ // failed; a simulation that ran never carries it.
230
+ if (simulationResponse?.metadata?.simulationUnavailable === true) {
231
+ console.warn(
232
+ 'Simulation for ETH undelegate is unavailable, proceeding without it',
233
+ simulationResponse?.metadata?.humanReadableError
234
+ )
235
+ return
236
+ }
237
+
226
238
  if (simulationResponse?.warnings?.length || simulationResponse?.metadata?.humanReadableError) {
227
239
  if (revertOnSimulationError) {
228
240
  const err = new Error('StakingEthUndelegateSimulationError')