@chainlink/ccip-sdk 0.91.0 → 0.92.0

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.
Files changed (273) hide show
  1. package/README.md +127 -80
  2. package/dist/aptos/hasher.d.ts.map +1 -1
  3. package/dist/aptos/hasher.js +7 -6
  4. package/dist/aptos/hasher.js.map +1 -1
  5. package/dist/aptos/index.d.ts +7 -2
  6. package/dist/aptos/index.d.ts.map +1 -1
  7. package/dist/aptos/index.js +29 -20
  8. package/dist/aptos/index.js.map +1 -1
  9. package/dist/aptos/logs.d.ts +5 -3
  10. package/dist/aptos/logs.d.ts.map +1 -1
  11. package/dist/aptos/logs.js +64 -27
  12. package/dist/aptos/logs.js.map +1 -1
  13. package/dist/aptos/token.d.ts.map +1 -1
  14. package/dist/aptos/token.js +2 -1
  15. package/dist/aptos/token.js.map +1 -1
  16. package/dist/aptos/types.js +6 -6
  17. package/dist/aptos/types.js.map +1 -1
  18. package/dist/chain.d.ts +36 -11
  19. package/dist/chain.d.ts.map +1 -1
  20. package/dist/chain.js +34 -2
  21. package/dist/chain.js.map +1 -1
  22. package/dist/commits.d.ts +2 -3
  23. package/dist/commits.d.ts.map +1 -1
  24. package/dist/commits.js +19 -8
  25. package/dist/commits.js.map +1 -1
  26. package/dist/errors/CCIPError.d.ts +48 -0
  27. package/dist/errors/CCIPError.d.ts.map +1 -0
  28. package/dist/errors/CCIPError.js +65 -0
  29. package/dist/errors/CCIPError.js.map +1 -0
  30. package/dist/errors/codes.d.ts +120 -0
  31. package/dist/errors/codes.d.ts.map +1 -0
  32. package/dist/errors/codes.js +156 -0
  33. package/dist/errors/codes.js.map +1 -0
  34. package/dist/errors/index.d.ts +26 -0
  35. package/dist/errors/index.d.ts.map +1 -0
  36. package/dist/errors/index.js +51 -0
  37. package/dist/errors/index.js.map +1 -0
  38. package/dist/errors/recovery.d.ts +6 -0
  39. package/dist/errors/recovery.d.ts.map +1 -0
  40. package/dist/errors/recovery.js +118 -0
  41. package/dist/errors/recovery.js.map +1 -0
  42. package/dist/errors/specialized.d.ts +637 -0
  43. package/dist/errors/specialized.d.ts.map +1 -0
  44. package/dist/errors/specialized.js +1298 -0
  45. package/dist/errors/specialized.js.map +1 -0
  46. package/dist/errors/utils.d.ts +11 -0
  47. package/dist/errors/utils.d.ts.map +1 -0
  48. package/dist/errors/utils.js +61 -0
  49. package/dist/errors/utils.js.map +1 -0
  50. package/dist/evm/abi/CommitStore_1_5.js +1 -1
  51. package/dist/evm/abi/LockReleaseTokenPool_1_5.js +1 -1
  52. package/dist/evm/abi/OffRamp_1_5.js +1 -1
  53. package/dist/evm/abi/OnRamp_1_5.js +1 -1
  54. package/dist/evm/abi/PriceRegistry_1_2.d.ts +443 -0
  55. package/dist/evm/abi/PriceRegistry_1_2.d.ts.map +1 -0
  56. package/dist/evm/abi/PriceRegistry_1_2.js +439 -0
  57. package/dist/evm/abi/PriceRegistry_1_2.js.map +1 -0
  58. package/dist/evm/const.d.ts +1 -0
  59. package/dist/evm/const.d.ts.map +1 -1
  60. package/dist/evm/const.js +2 -0
  61. package/dist/evm/const.js.map +1 -1
  62. package/dist/evm/hasher.d.ts.map +1 -1
  63. package/dist/evm/hasher.js +7 -6
  64. package/dist/evm/hasher.js.map +1 -1
  65. package/dist/evm/index.d.ts +9 -13
  66. package/dist/evm/index.d.ts.map +1 -1
  67. package/dist/evm/index.js +85 -68
  68. package/dist/evm/index.js.map +1 -1
  69. package/dist/evm/logs.d.ts.map +1 -1
  70. package/dist/evm/logs.js +47 -16
  71. package/dist/evm/logs.js.map +1 -1
  72. package/dist/evm/messages.d.ts +7 -6
  73. package/dist/evm/messages.d.ts.map +1 -1
  74. package/dist/evm/offchain.js +1 -1
  75. package/dist/evm/offchain.js.map +1 -1
  76. package/dist/evm/types.d.ts +10 -0
  77. package/dist/evm/types.d.ts.map +1 -0
  78. package/dist/evm/types.js +2 -0
  79. package/dist/evm/types.js.map +1 -0
  80. package/dist/execution.d.ts.map +1 -1
  81. package/dist/execution.js +9 -5
  82. package/dist/execution.js.map +1 -1
  83. package/dist/extra-args.d.ts.map +1 -1
  84. package/dist/extra-args.js +4 -3
  85. package/dist/extra-args.js.map +1 -1
  86. package/dist/gas.d.ts.map +1 -1
  87. package/dist/gas.js +3 -2
  88. package/dist/gas.js.map +1 -1
  89. package/dist/hasher/hasher.d.ts.map +1 -1
  90. package/dist/hasher/hasher.js +2 -1
  91. package/dist/hasher/hasher.js.map +1 -1
  92. package/dist/hasher/merklemulti.d.ts.map +1 -1
  93. package/dist/hasher/merklemulti.js +9 -8
  94. package/dist/hasher/merklemulti.js.map +1 -1
  95. package/dist/index.d.ts +5 -2
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +6 -2
  98. package/dist/index.js.map +1 -1
  99. package/dist/offchain.d.ts.map +1 -1
  100. package/dist/offchain.js +5 -8
  101. package/dist/offchain.js.map +1 -1
  102. package/dist/requests.d.ts +1 -1
  103. package/dist/requests.d.ts.map +1 -1
  104. package/dist/requests.js +37 -43
  105. package/dist/requests.js.map +1 -1
  106. package/dist/selectors.d.ts.map +1 -1
  107. package/dist/selectors.js +22 -0
  108. package/dist/selectors.js.map +1 -1
  109. package/dist/solana/cleanup.d.ts +2 -2
  110. package/dist/solana/cleanup.d.ts.map +1 -1
  111. package/dist/solana/cleanup.js +2 -3
  112. package/dist/solana/cleanup.js.map +1 -1
  113. package/dist/solana/exec.d.ts.map +1 -1
  114. package/dist/solana/exec.js +12 -12
  115. package/dist/solana/exec.js.map +1 -1
  116. package/dist/solana/hasher.d.ts.map +1 -1
  117. package/dist/solana/hasher.js +6 -5
  118. package/dist/solana/hasher.js.map +1 -1
  119. package/dist/solana/index.d.ts +30 -13
  120. package/dist/solana/index.d.ts.map +1 -1
  121. package/dist/solana/index.js +96 -143
  122. package/dist/solana/index.js.map +1 -1
  123. package/dist/solana/logs.d.ts +15 -0
  124. package/dist/solana/logs.d.ts.map +1 -0
  125. package/dist/solana/logs.js +106 -0
  126. package/dist/solana/logs.js.map +1 -0
  127. package/dist/solana/offchain.d.ts.map +1 -1
  128. package/dist/solana/offchain.js +6 -5
  129. package/dist/solana/offchain.js.map +1 -1
  130. package/dist/solana/patchBorsh.d.ts.map +1 -1
  131. package/dist/solana/patchBorsh.js +3 -2
  132. package/dist/solana/patchBorsh.js.map +1 -1
  133. package/dist/solana/send.d.ts.map +1 -1
  134. package/dist/solana/send.js +8 -7
  135. package/dist/solana/send.js.map +1 -1
  136. package/dist/solana/utils.d.ts +7 -8
  137. package/dist/solana/utils.d.ts.map +1 -1
  138. package/dist/solana/utils.js +23 -11
  139. package/dist/solana/utils.js.map +1 -1
  140. package/dist/sui/discovery.d.ts +18 -0
  141. package/dist/sui/discovery.d.ts.map +1 -0
  142. package/dist/sui/discovery.js +116 -0
  143. package/dist/sui/discovery.js.map +1 -0
  144. package/dist/sui/events.d.ts +36 -0
  145. package/dist/sui/events.d.ts.map +1 -0
  146. package/dist/sui/events.js +179 -0
  147. package/dist/sui/events.js.map +1 -0
  148. package/dist/sui/hasher.d.ts.map +1 -1
  149. package/dist/sui/hasher.js +6 -5
  150. package/dist/sui/hasher.js.map +1 -1
  151. package/dist/sui/index.d.ts +69 -41
  152. package/dist/sui/index.d.ts.map +1 -1
  153. package/dist/sui/index.js +402 -65
  154. package/dist/sui/index.js.map +1 -1
  155. package/dist/sui/manuallyExec/encoder.d.ts +8 -0
  156. package/dist/sui/manuallyExec/encoder.d.ts.map +1 -0
  157. package/dist/sui/manuallyExec/encoder.js +76 -0
  158. package/dist/sui/manuallyExec/encoder.js.map +1 -0
  159. package/dist/sui/manuallyExec/index.d.ts +37 -0
  160. package/dist/sui/manuallyExec/index.d.ts.map +1 -0
  161. package/dist/sui/manuallyExec/index.js +81 -0
  162. package/dist/sui/manuallyExec/index.js.map +1 -0
  163. package/dist/sui/objects.d.ts +46 -0
  164. package/dist/sui/objects.d.ts.map +1 -0
  165. package/dist/sui/objects.js +259 -0
  166. package/dist/sui/objects.js.map +1 -0
  167. package/dist/ton/bindings/offramp.d.ts +48 -0
  168. package/dist/ton/bindings/offramp.d.ts.map +1 -0
  169. package/dist/ton/bindings/offramp.js +63 -0
  170. package/dist/ton/bindings/offramp.js.map +1 -0
  171. package/dist/ton/bindings/onramp.d.ts +40 -0
  172. package/dist/ton/bindings/onramp.d.ts.map +1 -0
  173. package/dist/ton/bindings/onramp.js +51 -0
  174. package/dist/ton/bindings/onramp.js.map +1 -0
  175. package/dist/ton/bindings/router.d.ts +47 -0
  176. package/dist/ton/bindings/router.d.ts.map +1 -0
  177. package/dist/ton/bindings/router.js +51 -0
  178. package/dist/ton/bindings/router.js.map +1 -0
  179. package/dist/ton/exec.d.ts +18 -0
  180. package/dist/ton/exec.d.ts.map +1 -0
  181. package/dist/ton/exec.js +28 -0
  182. package/dist/ton/exec.js.map +1 -0
  183. package/dist/ton/hasher.d.ts +27 -0
  184. package/dist/ton/hasher.d.ts.map +1 -0
  185. package/dist/ton/hasher.js +134 -0
  186. package/dist/ton/hasher.js.map +1 -0
  187. package/dist/ton/index.d.ts +247 -0
  188. package/dist/ton/index.d.ts.map +1 -0
  189. package/dist/ton/index.js +781 -0
  190. package/dist/ton/index.js.map +1 -0
  191. package/dist/ton/logs.d.ts +26 -0
  192. package/dist/ton/logs.d.ts.map +1 -0
  193. package/dist/ton/logs.js +126 -0
  194. package/dist/ton/logs.js.map +1 -0
  195. package/dist/ton/types.d.ts +37 -0
  196. package/dist/ton/types.d.ts.map +1 -0
  197. package/dist/ton/types.js +92 -0
  198. package/dist/ton/types.js.map +1 -0
  199. package/dist/ton/utils.d.ts +67 -0
  200. package/dist/ton/utils.d.ts.map +1 -0
  201. package/dist/ton/utils.js +425 -0
  202. package/dist/ton/utils.js.map +1 -0
  203. package/dist/types.d.ts +4 -2
  204. package/dist/types.d.ts.map +1 -1
  205. package/dist/types.js +1 -0
  206. package/dist/types.js.map +1 -1
  207. package/dist/utils.d.ts +10 -0
  208. package/dist/utils.d.ts.map +1 -1
  209. package/dist/utils.js +52 -17
  210. package/dist/utils.js.map +1 -1
  211. package/package.json +12 -10
  212. package/src/aptos/hasher.ts +10 -6
  213. package/src/aptos/index.ts +50 -31
  214. package/src/aptos/logs.ts +85 -29
  215. package/src/aptos/token.ts +5 -1
  216. package/src/aptos/types.ts +6 -6
  217. package/src/chain.ts +83 -12
  218. package/src/commits.ts +23 -11
  219. package/src/errors/CCIPError.ts +86 -0
  220. package/src/errors/codes.ts +179 -0
  221. package/src/errors/index.ts +175 -0
  222. package/src/errors/recovery.ts +170 -0
  223. package/src/errors/specialized.ts +1655 -0
  224. package/src/errors/utils.ts +73 -0
  225. package/src/evm/abi/CommitStore_1_5.ts +1 -1
  226. package/src/evm/abi/LockReleaseTokenPool_1_5.ts +1 -1
  227. package/src/evm/abi/OffRamp_1_5.ts +1 -1
  228. package/src/evm/abi/OnRamp_1_5.ts +1 -1
  229. package/src/evm/abi/PriceRegistry_1_2.ts +438 -0
  230. package/src/evm/const.ts +2 -0
  231. package/src/evm/hasher.ts +7 -6
  232. package/src/evm/index.ts +104 -86
  233. package/src/evm/logs.ts +64 -16
  234. package/src/evm/messages.ts +14 -14
  235. package/src/evm/offchain.ts +1 -1
  236. package/src/evm/types.ts +11 -0
  237. package/src/execution.ts +13 -9
  238. package/src/extra-args.ts +4 -3
  239. package/src/gas.ts +10 -3
  240. package/src/hasher/hasher.ts +2 -1
  241. package/src/hasher/merklemulti.ts +18 -8
  242. package/src/index.ts +14 -2
  243. package/src/offchain.ts +10 -14
  244. package/src/requests.ts +51 -53
  245. package/src/selectors.ts +23 -0
  246. package/src/solana/cleanup.ts +2 -4
  247. package/src/solana/exec.ts +13 -13
  248. package/src/solana/hasher.ts +9 -5
  249. package/src/solana/index.ts +126 -200
  250. package/src/solana/logs.ts +155 -0
  251. package/src/solana/offchain.ts +10 -7
  252. package/src/solana/patchBorsh.ts +3 -2
  253. package/src/solana/send.ts +14 -7
  254. package/src/solana/utils.ts +31 -17
  255. package/src/sui/discovery.ts +163 -0
  256. package/src/sui/events.ts +328 -0
  257. package/src/sui/hasher.ts +6 -5
  258. package/src/sui/index.ts +528 -80
  259. package/src/sui/manuallyExec/encoder.ts +88 -0
  260. package/src/sui/manuallyExec/index.ts +137 -0
  261. package/src/sui/objects.ts +358 -0
  262. package/src/ton/bindings/offramp.ts +96 -0
  263. package/src/ton/bindings/onramp.ts +72 -0
  264. package/src/ton/bindings/router.ts +65 -0
  265. package/src/ton/exec.ts +44 -0
  266. package/src/ton/hasher.ts +184 -0
  267. package/src/ton/index.ts +989 -0
  268. package/src/ton/logs.ts +157 -0
  269. package/src/ton/types.ts +143 -0
  270. package/src/ton/utils.ts +514 -0
  271. package/src/types.ts +6 -2
  272. package/src/utils.ts +58 -23
  273. package/tsconfig.json +2 -1
package/src/utils.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { Buffer } from 'buffer'
2
-
3
1
  import bs58 from 'bs58'
4
2
  import {
5
3
  type BigNumberish,
@@ -13,7 +11,16 @@ import {
13
11
  } from 'ethers'
14
12
  import { memoize } from 'micro-memoize'
15
13
 
16
- import type { Chain } from './chain.ts'
14
+ import type { Chain, ChainStatic } from './chain.ts'
15
+ import {
16
+ CCIPBlockBeforeTimestampNotFoundError,
17
+ CCIPChainFamilyUnsupportedError,
18
+ CCIPChainNotFoundError,
19
+ CCIPDataFormatUnsupportedError,
20
+ CCIPError,
21
+ CCIPHttpError,
22
+ CCIPTypeVersionInvalidError,
23
+ } from './errors/index.ts'
17
24
  import SELECTORS from './selectors.ts'
18
25
  import { supportedChains } from './supported-chains.ts'
19
26
  import { type NetworkInfo, type WithLogger, ChainFamily } from './types.ts'
@@ -55,7 +62,7 @@ export async function getSomeBlockNumberBefore(
55
62
  }
56
63
 
57
64
  if (beforeTimestamp > timestamp) {
58
- throw new Error(`Could not find a block prior to timestamp=${timestamp}`)
65
+ throw new CCIPBlockBeforeTimestampNotFoundError(timestamp)
59
66
  }
60
67
 
61
68
  // now, bin-search based on timestamp proportions, looking for
@@ -96,7 +103,7 @@ export async function getSomeBlockNumberBefore(
96
103
  // memoized so we always output the same object for a given chainId
97
104
  const networkInfoFromChainId = memoize((chainId: NetworkInfo['chainId']): NetworkInfo => {
98
105
  const sel = SELECTORS[chainId]
99
- if (!sel?.name) throw new Error(`Chain not found: ${chainId}`)
106
+ if (!sel?.name) throw new CCIPChainNotFoundError(chainId)
100
107
  return {
101
108
  chainId: isNaN(+chainId) ? chainId : +chainId,
102
109
  chainSelector: sel.selector,
@@ -118,14 +125,17 @@ const networkInfoFromChainId = memoize((chainId: NetworkInfo['chainId']): Networ
118
125
  export const networkInfo = memoize(function networkInfo_(
119
126
  selectorOrIdOrName: bigint | number | string,
120
127
  ): NetworkInfo {
121
- let chainId
128
+ let chainId, match
122
129
  if (typeof selectorOrIdOrName === 'number') {
123
130
  chainId = selectorOrIdOrName
124
- } else if (typeof selectorOrIdOrName === 'string' && selectorOrIdOrName.match(/^\d+$/)) {
125
- selectorOrIdOrName = BigInt(selectorOrIdOrName)
131
+ } else if (
132
+ typeof selectorOrIdOrName === 'string' &&
133
+ (match = selectorOrIdOrName.match(/^(-?\d+)n?$/))
134
+ ) {
135
+ selectorOrIdOrName = BigInt(match[1])
126
136
  }
127
137
  if (typeof selectorOrIdOrName === 'bigint') {
128
- // maybe we got a number deserialized as bigint
138
+ // maybe we got a chainId deserialized as bigint
129
139
  if (selectorOrIdOrName.toString() in SELECTORS) {
130
140
  chainId = Number(selectorOrIdOrName)
131
141
  } else {
@@ -135,10 +145,10 @@ export const networkInfo = memoize(function networkInfo_(
135
145
  break
136
146
  }
137
147
  }
138
- if (!chainId) throw new Error(`Selector not found: ${selectorOrIdOrName}`)
148
+ if (!chainId) throw new CCIPChainNotFoundError(selectorOrIdOrName)
139
149
  }
140
150
  } else if (typeof selectorOrIdOrName === 'string') {
141
- if (selectorOrIdOrName.includes('-')) {
151
+ if (selectorOrIdOrName.includes('-', 1)) {
142
152
  for (const id in SELECTORS) {
143
153
  if (SELECTORS[id].name === selectorOrIdOrName) {
144
154
  chainId = id
@@ -212,10 +222,28 @@ export function bigIntReviver(_key: string, value: unknown): unknown {
212
222
  **/
213
223
  export function decodeAddress(address: BytesLike, family: ChainFamily = ChainFamily.EVM): string {
214
224
  const chain = supportedChains[family]
215
- if (!chain) throw new Error(`Unsupported chain family: ${family}`)
225
+ if (!chain) throw new CCIPChainFamilyUnsupportedError(family)
216
226
  return chain.getAddress(getAddressBytes(address))
217
227
  }
218
228
 
229
+ /**
230
+ * Validate a value is a txHash string in some supported chain family
231
+ **/
232
+ export function isSupportedTxHash(txHash: unknown, family?: ChainFamily): txHash is string {
233
+ let chains: ChainStatic[]
234
+ if (!family) chains = Object.values(supportedChains)
235
+ else if (family in supportedChains) chains = [supportedChains[family]!]
236
+ else throw new CCIPChainFamilyUnsupportedError(family)
237
+ for (const C of chains) {
238
+ try {
239
+ if (C.isTxHash(txHash)) return true
240
+ } catch (_) {
241
+ // continue
242
+ }
243
+ }
244
+ return false
245
+ }
246
+
219
247
  /**
220
248
  * Version of decodeAddress which is aware of custom cross-chain OnRamp formats
221
249
  **/
@@ -247,7 +275,6 @@ export function leToBigInt(data: BytesLike | readonly number[]): bigint {
247
275
  export function toLeArray(value: BigNumberish, width?: Numeric): Uint8Array {
248
276
  return toBeArray(value, width).reverse()
249
277
  }
250
-
251
278
  /**
252
279
  * Checks if the given data is a valid Base64 encoded string.
253
280
  * @param data - Data to check.
@@ -274,10 +301,19 @@ export function getDataBytes(data: BytesLike | readonly number[]): Uint8Array {
274
301
  } else if (isBase64(data)) {
275
302
  return decodeBase64(data)
276
303
  } else {
277
- throw new Error(`Unsupported data format: ${util.inspect(data)}`)
304
+ throw new CCIPDataFormatUnsupportedError(util.inspect(data))
278
305
  }
279
306
  }
280
307
 
308
+ /**
309
+ * Converts bytes to a Node.js Buffer.
310
+ * @param bytes - Bytes to convert (hex string, Uint8Array, Base64, etc).
311
+ * @returns Node.js Buffer.
312
+ */
313
+ export function bytesToBuffer(bytes: BytesLike | readonly number[]): Buffer {
314
+ return Buffer.from(getDataBytes(bytes))
315
+ }
316
+
281
317
  /**
282
318
  * Extracts address bytes, handling both hex and Base58 formats.
283
319
  * @param address - Address in hex or Base58 format.
@@ -349,10 +385,7 @@ export function parseTypeAndVersion(
349
385
  typeAndVersion: string,
350
386
  ): Awaited<ReturnType<Chain['typeAndVersion']>> {
351
387
  const match = typeAndVersion.match(/^(\w.+\S)\s+v?(\d+\.\d+(?:\.\d+)?)([^\d.].*)?$/)
352
- if (!match)
353
- throw new Error(
354
- `Invalid typeAndVersion: "${typeAndVersion}", len=${typeAndVersion.length}, hex=0x${Buffer.from(typeAndVersion).toString('hex')}`,
355
- )
388
+ if (!match) throw new CCIPTypeVersionInvalidError(typeAndVersion)
356
389
  const [, typeRaw, version] = match
357
390
  // some string normalization
358
391
  const type = typeRaw
@@ -414,6 +447,7 @@ export function createRateLimitedFetch(
414
447
  if (method && methodRateLimits[method]) {
415
448
  while (isMethodRateLimited(method)) {
416
449
  const oldestRequest = methodRateLimits[method].queue[0]
450
+ if (!oldestRequest) break // Queue was cleaned, no longer rate limited
417
451
  const waitTime = windowMs - (Date.now() - oldestRequest.timestamp)
418
452
  if (waitTime > 0) {
419
453
  await sleep(waitTime + 100) // Add small buffer
@@ -424,6 +458,7 @@ export function createRateLimitedFetch(
424
458
  // Wait for global rate limit
425
459
  while (isRateLimited()) {
426
460
  const oldestRequest = requestQueue[0]
461
+ if (!oldestRequest) break // Queue was cleaned, no longer rate limited
427
462
  const waitTime = windowMs - (Date.now() - oldestRequest.timestamp)
428
463
  if (waitTime > 0) {
429
464
  await sleep(waitTime + 100) // Add small buffer
@@ -484,7 +519,7 @@ export function createRateLimitedFetch(
484
519
  recordRequest(method)
485
520
  // logger.debug('__fetching', input, init?.body)
486
521
 
487
- const response = await fetch(input, init)
522
+ const response = await globalThis.fetch(input, init)
488
523
 
489
524
  // Update method rate limits from response headers
490
525
  updateMethodRateLimits(response, method)
@@ -497,15 +532,15 @@ export function createRateLimitedFetch(
497
532
 
498
533
  // For 429 responses, throw an error to trigger retry
499
534
  if (response.status === 429) {
500
- throw new Error(`HTTP ${response.status}: ${response.statusText}`)
535
+ throw new CCIPHttpError(response.status, response.statusText)
501
536
  }
502
537
 
503
538
  // For other non-2xx responses, don't retry
504
539
  logger.debug('fetch non-retryable error', input, response.status, init?.body)
505
- throw new Error(`HTTP ${response.status}: ${response.statusText}`)
540
+ throw new CCIPHttpError(response.status, response.statusText)
506
541
  } catch (error) {
507
542
  logger.debug('fetch errored', attempt, error, input, init?.body)
508
- lastError = error instanceof Error ? error : new Error(String(error))
543
+ lastError = error instanceof Error ? error : CCIPError.from(error, 'HTTP_ERROR')
509
544
 
510
545
  // Only retry on rate limit errors
511
546
  if (!isRateLimitError(lastError)) {
@@ -519,7 +554,7 @@ export function createRateLimitedFetch(
519
554
  }
520
555
  }
521
556
 
522
- throw lastError || new Error('Request failed after all retries')
557
+ throw lastError || CCIPError.from('Request failed after all retries', 'HTTP_ERROR')
523
558
  }
524
559
  }
525
560
 
package/tsconfig.json CHANGED
@@ -14,6 +14,7 @@
14
14
  "verbatimModuleSyntax": true,
15
15
  "erasableSyntaxOnly": true,
16
16
  "resolveJsonModule": true,
17
- "noImplicitOverride": true
17
+ "noImplicitOverride": true,
18
+ "useUnknownInCatchVariables": true
18
19
  }
19
20
  }