@chainlink/ccip-sdk 0.95.0 → 0.97.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 (217) hide show
  1. package/README.md +2 -2
  2. package/dist/all-chains.d.ts +23 -0
  3. package/dist/all-chains.d.ts.map +1 -0
  4. package/dist/all-chains.js +24 -0
  5. package/dist/all-chains.js.map +1 -0
  6. package/dist/api/index.d.ts +31 -19
  7. package/dist/api/index.d.ts.map +1 -1
  8. package/dist/api/index.js +46 -25
  9. package/dist/api/index.js.map +1 -1
  10. package/dist/api/types.d.ts +24 -30
  11. package/dist/api/types.d.ts.map +1 -1
  12. package/dist/aptos/exec.d.ts +2 -2
  13. package/dist/aptos/exec.d.ts.map +1 -1
  14. package/dist/aptos/exec.js.map +1 -1
  15. package/dist/aptos/hasher.d.ts.map +1 -1
  16. package/dist/aptos/hasher.js +1 -1
  17. package/dist/aptos/hasher.js.map +1 -1
  18. package/dist/aptos/index.d.ts +43 -15
  19. package/dist/aptos/index.d.ts.map +1 -1
  20. package/dist/aptos/index.js +112 -105
  21. package/dist/aptos/index.js.map +1 -1
  22. package/dist/aptos/types.d.ts +2 -19
  23. package/dist/aptos/types.d.ts.map +1 -1
  24. package/dist/aptos/types.js +0 -11
  25. package/dist/aptos/types.js.map +1 -1
  26. package/dist/chain.d.ts +734 -174
  27. package/dist/chain.d.ts.map +1 -1
  28. package/dist/chain.js +216 -31
  29. package/dist/chain.js.map +1 -1
  30. package/dist/commits.d.ts +4 -6
  31. package/dist/commits.d.ts.map +1 -1
  32. package/dist/commits.js +4 -4
  33. package/dist/commits.js.map +1 -1
  34. package/dist/errors/CCIPError.d.ts +33 -4
  35. package/dist/errors/CCIPError.d.ts.map +1 -1
  36. package/dist/errors/CCIPError.js +33 -4
  37. package/dist/errors/CCIPError.js.map +1 -1
  38. package/dist/errors/codes.d.ts +5 -0
  39. package/dist/errors/codes.d.ts.map +1 -1
  40. package/dist/errors/codes.js +5 -1
  41. package/dist/errors/codes.js.map +1 -1
  42. package/dist/errors/index.d.ts +2 -2
  43. package/dist/errors/index.d.ts.map +1 -1
  44. package/dist/errors/index.js +2 -2
  45. package/dist/errors/index.js.map +1 -1
  46. package/dist/errors/recovery.d.ts.map +1 -1
  47. package/dist/errors/recovery.js +6 -1
  48. package/dist/errors/recovery.js.map +1 -1
  49. package/dist/errors/specialized.d.ts +1702 -121
  50. package/dist/errors/specialized.d.ts.map +1 -1
  51. package/dist/errors/specialized.js +1729 -125
  52. package/dist/errors/specialized.js.map +1 -1
  53. package/dist/errors/utils.d.ts.map +1 -1
  54. package/dist/errors/utils.js +0 -1
  55. package/dist/errors/utils.js.map +1 -1
  56. package/dist/evm/abi/OffRamp_2_0.d.ts +764 -0
  57. package/dist/evm/abi/OffRamp_2_0.d.ts.map +1 -0
  58. package/dist/evm/abi/OffRamp_2_0.js +744 -0
  59. package/dist/evm/abi/OffRamp_2_0.js.map +1 -0
  60. package/dist/evm/abi/OnRamp_2_0.d.ts +925 -0
  61. package/dist/evm/abi/OnRamp_2_0.d.ts.map +1 -0
  62. package/dist/evm/abi/OnRamp_2_0.js +992 -0
  63. package/dist/evm/abi/OnRamp_2_0.js.map +1 -0
  64. package/dist/evm/const.d.ts +12 -2
  65. package/dist/evm/const.d.ts.map +1 -1
  66. package/dist/evm/const.js +8 -2
  67. package/dist/evm/const.js.map +1 -1
  68. package/dist/evm/errors.d.ts.map +1 -1
  69. package/dist/evm/errors.js +7 -2
  70. package/dist/evm/errors.js.map +1 -1
  71. package/dist/evm/extra-args.d.ts +25 -0
  72. package/dist/evm/extra-args.d.ts.map +1 -0
  73. package/dist/evm/extra-args.js +309 -0
  74. package/dist/evm/extra-args.js.map +1 -0
  75. package/dist/evm/gas.d.ts.map +1 -1
  76. package/dist/evm/gas.js +7 -12
  77. package/dist/evm/gas.js.map +1 -1
  78. package/dist/evm/hasher.d.ts.map +1 -1
  79. package/dist/evm/hasher.js +23 -13
  80. package/dist/evm/hasher.js.map +1 -1
  81. package/dist/evm/index.d.ts +140 -35
  82. package/dist/evm/index.d.ts.map +1 -1
  83. package/dist/evm/index.js +306 -226
  84. package/dist/evm/index.js.map +1 -1
  85. package/dist/evm/messages.d.ts +59 -5
  86. package/dist/evm/messages.d.ts.map +1 -1
  87. package/dist/evm/messages.js +210 -0
  88. package/dist/evm/messages.js.map +1 -1
  89. package/dist/evm/offchain.js.map +1 -1
  90. package/dist/evm/types.d.ts +7 -2
  91. package/dist/evm/types.d.ts.map +1 -1
  92. package/dist/evm/types.js +22 -1
  93. package/dist/evm/types.js.map +1 -1
  94. package/dist/execution.d.ts +62 -22
  95. package/dist/execution.d.ts.map +1 -1
  96. package/dist/execution.js +102 -51
  97. package/dist/execution.js.map +1 -1
  98. package/dist/extra-args.d.ts +113 -4
  99. package/dist/extra-args.d.ts.map +1 -1
  100. package/dist/extra-args.js +38 -3
  101. package/dist/extra-args.js.map +1 -1
  102. package/dist/gas.d.ts +31 -5
  103. package/dist/gas.d.ts.map +1 -1
  104. package/dist/gas.js +43 -9
  105. package/dist/gas.js.map +1 -1
  106. package/dist/index.d.ts +11 -10
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +8 -8
  109. package/dist/index.js.map +1 -1
  110. package/dist/requests.d.ts +101 -22
  111. package/dist/requests.d.ts.map +1 -1
  112. package/dist/requests.js +115 -24
  113. package/dist/requests.js.map +1 -1
  114. package/dist/selectors.d.ts.map +1 -1
  115. package/dist/selectors.js +24 -0
  116. package/dist/selectors.js.map +1 -1
  117. package/dist/shared/bcs-codecs.d.ts +61 -0
  118. package/dist/shared/bcs-codecs.d.ts.map +1 -0
  119. package/dist/shared/bcs-codecs.js +102 -0
  120. package/dist/shared/bcs-codecs.js.map +1 -0
  121. package/dist/shared/constants.d.ts +3 -0
  122. package/dist/shared/constants.d.ts.map +1 -0
  123. package/dist/shared/constants.js +3 -0
  124. package/dist/shared/constants.js.map +1 -0
  125. package/dist/solana/exec.d.ts +2 -2
  126. package/dist/solana/exec.d.ts.map +1 -1
  127. package/dist/solana/exec.js.map +1 -1
  128. package/dist/solana/index.d.ts +148 -30
  129. package/dist/solana/index.d.ts.map +1 -1
  130. package/dist/solana/index.js +137 -44
  131. package/dist/solana/index.js.map +1 -1
  132. package/dist/sui/hasher.d.ts.map +1 -1
  133. package/dist/sui/hasher.js +1 -1
  134. package/dist/sui/hasher.js.map +1 -1
  135. package/dist/sui/index.d.ts +49 -19
  136. package/dist/sui/index.d.ts.map +1 -1
  137. package/dist/sui/index.js +76 -43
  138. package/dist/sui/index.js.map +1 -1
  139. package/dist/sui/manuallyExec/encoder.d.ts +2 -2
  140. package/dist/sui/manuallyExec/encoder.d.ts.map +1 -1
  141. package/dist/sui/manuallyExec/encoder.js.map +1 -1
  142. package/dist/sui/manuallyExec/index.d.ts +2 -2
  143. package/dist/sui/manuallyExec/index.d.ts.map +1 -1
  144. package/dist/ton/exec.d.ts +2 -2
  145. package/dist/ton/exec.d.ts.map +1 -1
  146. package/dist/ton/exec.js.map +1 -1
  147. package/dist/ton/index.d.ts +66 -27
  148. package/dist/ton/index.d.ts.map +1 -1
  149. package/dist/ton/index.js +172 -47
  150. package/dist/ton/index.js.map +1 -1
  151. package/dist/ton/send.d.ts +52 -0
  152. package/dist/ton/send.d.ts.map +1 -0
  153. package/dist/ton/send.js +166 -0
  154. package/dist/ton/send.js.map +1 -0
  155. package/dist/ton/types.d.ts +2 -2
  156. package/dist/ton/types.d.ts.map +1 -1
  157. package/dist/ton/types.js.map +1 -1
  158. package/dist/types.d.ts +148 -12
  159. package/dist/types.d.ts.map +1 -1
  160. package/dist/types.js +6 -1
  161. package/dist/types.js.map +1 -1
  162. package/dist/utils.d.ts +79 -4
  163. package/dist/utils.d.ts.map +1 -1
  164. package/dist/utils.js +92 -7
  165. package/dist/utils.js.map +1 -1
  166. package/package.json +16 -11
  167. package/src/all-chains.ts +26 -0
  168. package/src/api/index.ts +58 -34
  169. package/src/api/types.ts +24 -31
  170. package/src/aptos/exec.ts +2 -2
  171. package/src/aptos/hasher.ts +1 -1
  172. package/src/aptos/index.ts +127 -129
  173. package/src/aptos/types.ts +2 -15
  174. package/src/chain.ts +837 -191
  175. package/src/commits.ts +9 -9
  176. package/src/errors/CCIPError.ts +33 -4
  177. package/src/errors/codes.ts +5 -1
  178. package/src/errors/index.ts +2 -1
  179. package/src/errors/recovery.ts +9 -1
  180. package/src/errors/specialized.ts +1745 -132
  181. package/src/errors/utils.ts +0 -1
  182. package/src/evm/abi/OffRamp_2_0.ts +743 -0
  183. package/src/evm/abi/OnRamp_2_0.ts +991 -0
  184. package/src/evm/const.ts +10 -3
  185. package/src/evm/errors.ts +6 -2
  186. package/src/evm/extra-args.ts +360 -0
  187. package/src/evm/gas.ts +14 -13
  188. package/src/evm/hasher.ts +30 -18
  189. package/src/evm/index.ts +376 -281
  190. package/src/evm/messages.ts +323 -11
  191. package/src/evm/offchain.ts +2 -2
  192. package/src/evm/types.ts +20 -2
  193. package/src/execution.ts +126 -71
  194. package/src/extra-args.ts +118 -4
  195. package/src/gas.ts +44 -11
  196. package/src/index.ts +14 -11
  197. package/src/requests.ts +128 -24
  198. package/src/selectors.ts +24 -0
  199. package/src/shared/bcs-codecs.ts +132 -0
  200. package/src/shared/constants.ts +2 -0
  201. package/src/solana/exec.ts +4 -4
  202. package/src/solana/index.ts +170 -82
  203. package/src/sui/hasher.ts +1 -1
  204. package/src/sui/index.ts +88 -56
  205. package/src/sui/manuallyExec/encoder.ts +2 -2
  206. package/src/sui/manuallyExec/index.ts +2 -2
  207. package/src/ton/exec.ts +2 -2
  208. package/src/ton/index.ts +220 -58
  209. package/src/ton/send.ts +222 -0
  210. package/src/ton/types.ts +2 -2
  211. package/src/types.ts +173 -30
  212. package/src/utils.ts +91 -7
  213. package/dist/aptos/utils.d.ts +0 -12
  214. package/dist/aptos/utils.d.ts.map +0 -1
  215. package/dist/aptos/utils.js +0 -15
  216. package/dist/aptos/utils.js.map +0 -1
  217. package/src/aptos/utils.ts +0 -24
package/src/utils.ts CHANGED
@@ -38,7 +38,8 @@ import { type NetworkInfo, type WithLogger, ChainFamily } from './types.ts'
38
38
  * @param timestamp - target timestamp
39
39
  * @param precision - returned blockNumber should be within this many blocks before timestamp
40
40
  * @returns blockNumber of a block at provider which is close but before target timestamp
41
- **/
41
+ * @throws {@link CCIPBlockBeforeTimestampNotFoundError} if no block exists before the given timestamp
42
+ */
42
43
  export async function getSomeBlockNumberBefore(
43
44
  getBlockTimestamp: (blockNumber: number) => Promise<number>,
44
45
  recentBlockNumber: number,
@@ -106,9 +107,9 @@ export async function getSomeBlockNumberBefore(
106
107
  }
107
108
 
108
109
  /**
109
- * Checks if a chain is a testnet
110
+ * Converts a chain ID to complete NetworkInfo.
111
+ * Memoized to return the same object reference for a given chainId.
110
112
  */
111
- // memoized so we always output the same object for a given chainId
112
113
  const networkInfoFromChainId = memoize((chainId: NetworkInfo['chainId']): NetworkInfo => {
113
114
  const sel = SELECTORS[chainId]
114
115
  if (!sel?.name) throw new CCIPChainNotFoundError(chainId)
@@ -129,6 +130,24 @@ const networkInfoFromChainId = memoize((chainId: NetworkInfo['chainId']): Networ
129
130
  * - Chain ID as number, bigint or string (EVM: "1", Aptos: "aptos:1", Solana: genesisHash)
130
131
  * - Chain name as string ("ethereum-mainnet")
131
132
  * @returns Complete NetworkInfo object
133
+ * @throws {@link CCIPChainNotFoundError} if chain is not found
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * import { networkInfo } from '@chainlink/ccip-sdk'
138
+ *
139
+ * // By chain name
140
+ * const sepolia = networkInfo('ethereum-testnet-sepolia')
141
+ * console.log('Selector:', sepolia.chainSelector)
142
+ *
143
+ * // By chain selector
144
+ * const fuji = networkInfo(14767482510784806043n)
145
+ * console.log('Name:', fuji.name) // 'avalanche-testnet-fuji'
146
+ *
147
+ * // By chain ID
148
+ * const mainnet = networkInfo(1)
149
+ * console.log('Family:', mainnet.family) // 'EVM'
150
+ * ```
132
151
  */
133
152
  export const networkInfo = memoize(function networkInfo_(
134
153
  selectorOrIdOrName: bigint | number | string,
@@ -204,6 +223,15 @@ export function* blockRangeGenerator(
204
223
  * @param _key - Property key (unused).
205
224
  * @param value - Value to transform.
206
225
  * @returns String representation if BigInt, otherwise unchanged value.
226
+ * @example
227
+ * ```typescript
228
+ * import { bigIntReplacer } from '@chainlink/ccip-sdk'
229
+ *
230
+ * const data = { amount: 1000000000000000000n }
231
+ * const json = JSON.stringify(data, bigIntReplacer)
232
+ * console.log(json) // '{"amount":"1000000000000000000"}'
233
+ * ```
234
+ * @see {@link bigIntReviver} - Revive BigInt values when parsing
207
235
  */
208
236
  export function bigIntReplacer(_key: string, value: unknown): unknown {
209
237
  if (typeof value === 'bigint') {
@@ -217,6 +245,15 @@ export function bigIntReplacer(_key: string, value: unknown): unknown {
217
245
  * @param _key - Property key (unused).
218
246
  * @param value - Value to transform.
219
247
  * @returns BigInt if numeric string, otherwise unchanged value.
248
+ * @example
249
+ * ```typescript
250
+ * import { bigIntReviver } from '@chainlink/ccip-sdk'
251
+ *
252
+ * const json = '{"amount":"1000000000000000000"}'
253
+ * const data = JSON.parse(json, bigIntReviver)
254
+ * console.log(typeof data.amount) // 'bigint'
255
+ * ```
256
+ * @see {@link bigIntReplacer} - Stringify BigInt values
220
257
  */
221
258
  export function bigIntReviver(_key: string, value: unknown): unknown {
222
259
  if (typeof value === 'string' && /^\d+$/.test(value)) {
@@ -236,8 +273,26 @@ export function parseJson<T = unknown>(text: string): T {
236
273
  }
237
274
 
238
275
  /**
239
- * Decode address from a 32-byte hex string
240
- **/
276
+ * Decode address from a 32-byte hex string.
277
+ *
278
+ * @param address - Address bytes to decode (hex string or Uint8Array)
279
+ * @param family - Chain family for address format (defaults to EVM)
280
+ * @returns Decoded address string
281
+ * @throws {@link CCIPChainFamilyUnsupportedError} if chain family is not supported
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * import { decodeAddress, ChainFamily } from '@chainlink/ccip-sdk'
286
+ *
287
+ * // Decode EVM address from 32-byte hex
288
+ * const evmAddr = decodeAddress('0x000000000000000000000000abc123...', ChainFamily.EVM)
289
+ * console.log(evmAddr) // '0xABC123...'
290
+ *
291
+ * // Decode Solana address
292
+ * const solAddr = decodeAddress(bytes, ChainFamily.Solana)
293
+ * console.log(solAddr) // Base58 encoded address
294
+ * ```
295
+ */
241
296
  export function decodeAddress(address: BytesLike, family: ChainFamily = ChainFamily.EVM): string {
242
297
  const chain = supportedChains[family]
243
298
  if (!chain) throw new CCIPChainFamilyUnsupportedError(family)
@@ -246,7 +301,11 @@ export function decodeAddress(address: BytesLike, family: ChainFamily = ChainFam
246
301
 
247
302
  /**
248
303
  * Validate a value is a txHash string in some supported chain family
249
- **/
304
+ * @param txHash - Value to check
305
+ * @param family - Optional chain family to validate against
306
+ * @returns true if value is a valid transaction hash
307
+ * @throws {@link CCIPChainFamilyUnsupportedError} if specified chain family is not supported
308
+ */
250
309
  export function isSupportedTxHash(txHash: unknown, family?: ChainFamily): txHash is string {
251
310
  let chains: ChainStatic[]
252
311
  if (!family) chains = Object.values(supportedChains)
@@ -309,6 +368,21 @@ export function isBase64(data: unknown): data is string {
309
368
  * Converts various data formats to Uint8Array.
310
369
  * @param data - Bytes, number array, or Base64 string.
311
370
  * @returns Uint8Array representation.
371
+ * @throws {@link CCIPDataFormatUnsupportedError} if data format is not recognized
372
+ *
373
+ * @example
374
+ * ```typescript
375
+ * import { getDataBytes } from '@chainlink/ccip-sdk'
376
+ *
377
+ * // From hex string
378
+ * const bytes1 = getDataBytes('0x1234abcd')
379
+ *
380
+ * // From number array
381
+ * const bytes2 = getDataBytes([0x12, 0x34, 0xab, 0xcd])
382
+ *
383
+ * // From Base64
384
+ * const bytes3 = getDataBytes('EjSrzQ==')
385
+ * ```
312
386
  */
313
387
  export function getDataBytes(data: BytesLike | readonly number[]): Uint8Array {
314
388
  if (Array.isArray(data)) return new Uint8Array(data)
@@ -358,6 +432,14 @@ export function getAddressBytes(address: BytesLike | readonly number[]): Uint8Ar
358
432
  ? '0x' + address
359
433
  : address,
360
434
  )
435
+ } else if (typeof address === 'string' && /^-?\d+:[0-9a-f]{64}$/i.test(address)) {
436
+ // TON raw format: "workchain:hash" → 36-byte CCIP format (4-byte BE workchain + 32-byte hash)
437
+ const [workchain, hash] = address.split(':')
438
+ const buf = new Uint8Array(36)
439
+ const view = new DataView(buf.buffer)
440
+ view.setInt32(0, parseInt(workchain!, 10), false) // big-endian
441
+ buf.set(getBytes('0x' + hash), 4)
442
+ bytes = buf
361
443
  } else {
362
444
  try {
363
445
  const bytes_ = bs58.decode(address as string)
@@ -409,7 +491,8 @@ export function convertKeysToCamelCase(
409
491
  * @param ms - Duration in milliseconds.
410
492
  * @returns Promise that resolves after the specified duration.
411
493
  */
412
- export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms).unref())
494
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- unref is Node.js-only; browsers return number
495
+ export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms).unref?.())
413
496
 
414
497
  /**
415
498
  * Configuration for the withRetry utility.
@@ -518,6 +601,7 @@ export async function withRetry<T>(
518
601
  * Parses a typeAndVersion string into its components.
519
602
  * @param typeAndVersion - String in format "TypeName vX.Y.Z".
520
603
  * @returns Tuple of [type, version, original, suffix?].
604
+ * @throws {@link CCIPTypeVersionInvalidError} if string format is invalid
521
605
  */
522
606
  export function parseTypeAndVersion(
523
607
  typeAndVersion: string,
@@ -1,12 +0,0 @@
1
- import { type BigNumberish, type BytesLike } from 'ethers';
2
- /**
3
- * Encodes a numeric value as a 32-byte hex string.
4
- * @param value - Numeric value to encode.
5
- * @returns 32-byte hex string representation of the value.
6
- */
7
- export declare const encodeNumber: (value: BigNumberish) => string;
8
- /**
9
- * Encodes dynamic bytes without the struct offset prefix.
10
- */
11
- export declare const encodeRawBytes: (value: BytesLike) => string;
12
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/aptos/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,SAAS,EAKf,MAAM,QAAQ,CAAA;AAEf;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,YAAY,KAAG,MAA4B,CAAA;AAE/E;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,SAAS,KAAG,MAI9C,CAAA"}
@@ -1,15 +0,0 @@
1
- import { concat, dataLength, toBeHex, zeroPadBytes, } from 'ethers';
2
- /**
3
- * Encodes a numeric value as a 32-byte hex string.
4
- * @param value - Numeric value to encode.
5
- * @returns 32-byte hex string representation of the value.
6
- */
7
- export const encodeNumber = (value) => toBeHex(value, 32);
8
- /**
9
- * Encodes dynamic bytes without the struct offset prefix.
10
- */
11
- export const encodeRawBytes = (value) => concat([
12
- encodeNumber(dataLength(value)),
13
- zeroPadBytes(value, Math.ceil(dataLength(value) / 32) * 32),
14
- ]);
15
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/aptos/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,MAAM,EACN,UAAU,EACV,OAAO,EACP,YAAY,GACb,MAAM,QAAQ,CAAA;AAEf;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAU,EAAE,CACzD,MAAM,CAAC;IACL,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;CAC5D,CAAC,CAAA"}
@@ -1,24 +0,0 @@
1
- import {
2
- type BigNumberish,
3
- type BytesLike,
4
- concat,
5
- dataLength,
6
- toBeHex,
7
- zeroPadBytes,
8
- } from 'ethers'
9
-
10
- /**
11
- * Encodes a numeric value as a 32-byte hex string.
12
- * @param value - Numeric value to encode.
13
- * @returns 32-byte hex string representation of the value.
14
- */
15
- export const encodeNumber = (value: BigNumberish): string => toBeHex(value, 32)
16
-
17
- /**
18
- * Encodes dynamic bytes without the struct offset prefix.
19
- */
20
- export const encodeRawBytes = (value: BytesLike): string =>
21
- concat([
22
- encodeNumber(dataLength(value)),
23
- zeroPadBytes(value, Math.ceil(dataLength(value) / 32) * 32),
24
- ])