viem 2.0.10 → 2.1.1

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 (102) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/_cjs/chains/definitions/baseSepolia.js +4 -0
  3. package/_cjs/chains/definitions/baseSepolia.js.map +1 -1
  4. package/_cjs/chains/definitions/holesky.js +6 -0
  5. package/_cjs/chains/definitions/holesky.js.map +1 -1
  6. package/_cjs/chains/definitions/lightlinkPegasus.js +30 -0
  7. package/_cjs/chains/definitions/lightlinkPegasus.js.map +1 -0
  8. package/_cjs/chains/definitions/lightlinkPhoenix.js +30 -0
  9. package/_cjs/chains/definitions/lightlinkPhoenix.js.map +1 -0
  10. package/_cjs/chains/definitions/neonMainnet.js +6 -1
  11. package/_cjs/chains/definitions/neonMainnet.js.map +1 -1
  12. package/_cjs/chains/definitions/palm.js +32 -0
  13. package/_cjs/chains/definitions/palm.js.map +1 -0
  14. package/_cjs/chains/definitions/palmTestnet.js +33 -0
  15. package/_cjs/chains/definitions/palmTestnet.js.map +1 -0
  16. package/_cjs/chains/index.js +11 -3
  17. package/_cjs/chains/index.js.map +1 -1
  18. package/_cjs/errors/cursor.js +13 -1
  19. package/_cjs/errors/cursor.js.map +1 -1
  20. package/_cjs/errors/version.js +1 -1
  21. package/_cjs/errors/version.js.map +1 -1
  22. package/_cjs/utils/abi/decodeAbiParameters.js +117 -126
  23. package/_cjs/utils/abi/decodeAbiParameters.js.map +1 -1
  24. package/_cjs/utils/abi/decodeEventLog.js +7 -4
  25. package/_cjs/utils/abi/decodeEventLog.js.map +1 -1
  26. package/_cjs/utils/cursor.js +40 -3
  27. package/_cjs/utils/cursor.js.map +1 -1
  28. package/_cjs/utils/encoding/fromBytes.js +2 -2
  29. package/_cjs/utils/encoding/fromBytes.js.map +1 -1
  30. package/_cjs/utils/encoding/fromRlp.js +1 -1
  31. package/_cjs/utils/encoding/fromRlp.js.map +1 -1
  32. package/_esm/chains/definitions/baseSepolia.js +4 -0
  33. package/_esm/chains/definitions/baseSepolia.js.map +1 -1
  34. package/_esm/chains/definitions/holesky.js +6 -0
  35. package/_esm/chains/definitions/holesky.js.map +1 -1
  36. package/_esm/chains/definitions/lightlinkPegasus.js +27 -0
  37. package/_esm/chains/definitions/lightlinkPegasus.js.map +1 -0
  38. package/_esm/chains/definitions/lightlinkPhoenix.js +27 -0
  39. package/_esm/chains/definitions/lightlinkPhoenix.js.map +1 -0
  40. package/_esm/chains/definitions/neonMainnet.js +6 -1
  41. package/_esm/chains/definitions/neonMainnet.js.map +1 -1
  42. package/_esm/chains/definitions/palm.js +29 -0
  43. package/_esm/chains/definitions/palm.js.map +1 -0
  44. package/_esm/chains/definitions/palmTestnet.js +30 -0
  45. package/_esm/chains/definitions/palmTestnet.js.map +1 -0
  46. package/_esm/chains/index.js +4 -0
  47. package/_esm/chains/index.js.map +1 -1
  48. package/_esm/errors/cursor.js +11 -0
  49. package/_esm/errors/cursor.js.map +1 -1
  50. package/_esm/errors/version.js +1 -1
  51. package/_esm/errors/version.js.map +1 -1
  52. package/_esm/utils/abi/decodeAbiParameters.js +145 -140
  53. package/_esm/utils/abi/decodeAbiParameters.js.map +1 -1
  54. package/_esm/utils/abi/decodeEventLog.js +7 -4
  55. package/_esm/utils/abi/decodeEventLog.js.map +1 -1
  56. package/_esm/utils/cursor.js +41 -4
  57. package/_esm/utils/cursor.js.map +1 -1
  58. package/_esm/utils/encoding/fromBytes.js +2 -2
  59. package/_esm/utils/encoding/fromBytes.js.map +1 -1
  60. package/_esm/utils/encoding/fromRlp.js +1 -1
  61. package/_esm/utils/encoding/fromRlp.js.map +1 -1
  62. package/_types/chains/definitions/baseSepolia.d.ts +4 -0
  63. package/_types/chains/definitions/baseSepolia.d.ts.map +1 -1
  64. package/_types/chains/definitions/holesky.d.ts +5 -11
  65. package/_types/chains/definitions/holesky.d.ts.map +1 -1
  66. package/_types/chains/definitions/lightlinkPegasus.d.ts +35 -0
  67. package/_types/chains/definitions/lightlinkPegasus.d.ts.map +1 -0
  68. package/_types/chains/definitions/lightlinkPhoenix.d.ts +35 -0
  69. package/_types/chains/definitions/lightlinkPhoenix.d.ts.map +1 -0
  70. package/_types/chains/definitions/neonMainnet.d.ts +6 -1
  71. package/_types/chains/definitions/neonMainnet.d.ts.map +1 -1
  72. package/_types/chains/definitions/palm.d.ts +33 -0
  73. package/_types/chains/definitions/palm.d.ts.map +1 -0
  74. package/_types/chains/definitions/palmTestnet.d.ts +33 -0
  75. package/_types/chains/definitions/palmTestnet.d.ts.map +1 -0
  76. package/_types/chains/index.d.ts +4 -0
  77. package/_types/chains/index.d.ts.map +1 -1
  78. package/_types/errors/cursor.d.ts +10 -0
  79. package/_types/errors/cursor.d.ts.map +1 -1
  80. package/_types/errors/version.d.ts +1 -1
  81. package/_types/errors/version.d.ts.map +1 -1
  82. package/_types/utils/abi/decodeAbiParameters.d.ts +18 -19
  83. package/_types/utils/abi/decodeAbiParameters.d.ts.map +1 -1
  84. package/_types/utils/abi/decodeEventLog.d.ts.map +1 -1
  85. package/_types/utils/cursor.d.ts +13 -3
  86. package/_types/utils/cursor.d.ts.map +1 -1
  87. package/chains/definitions/baseSepolia.ts +4 -0
  88. package/chains/definitions/holesky.ts +6 -0
  89. package/chains/definitions/lightlinkPegasus.ts +27 -0
  90. package/chains/definitions/lightlinkPhoenix.ts +27 -0
  91. package/chains/definitions/neonMainnet.ts +6 -1
  92. package/chains/definitions/palm.ts +29 -0
  93. package/chains/definitions/palmTestnet.ts +30 -0
  94. package/chains/index.ts +4 -0
  95. package/errors/cursor.ts +13 -0
  96. package/errors/version.ts +1 -1
  97. package/package.json +1 -1
  98. package/utils/abi/decodeAbiParameters.ts +226 -249
  99. package/utils/abi/decodeEventLog.ts +9 -4
  100. package/utils/cursor.ts +53 -6
  101. package/utils/encoding/fromBytes.ts +2 -2
  102. package/utils/encoding/fromRlp.ts +1 -1
package/utils/cursor.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  NegativeOffsetError,
3
3
  PositionOutOfBoundsError,
4
+ RecursiveReadLimitExceededError,
4
5
  } from '../errors/cursor.js'
5
6
  import type { ErrorType } from '../errors/utils.js'
6
7
  import type { ByteArray } from '../types/misc.js'
@@ -9,8 +10,13 @@ export type Cursor = {
9
10
  bytes: ByteArray
10
11
  dataView: DataView
11
12
  position: number
13
+ positionReadCount: Map<number, number>
14
+ recursiveReadCount: number
15
+ recursiveReadLimit: number
16
+ assertReadLimit(position?: number): void
12
17
  assertPosition(position: number): void
13
18
  decrementPosition(offset: number): void
19
+ getReadCount(position?: number): number
14
20
  incrementPosition(offset: number): void
15
21
  inspectByte(position?: number): ByteArray[number]
16
22
  inspectBytes(length: number, position?: number): ByteArray
@@ -25,12 +31,13 @@ export type Cursor = {
25
31
  pushUint24(value: number): void
26
32
  pushUint32(value: number): void
27
33
  readByte(): ByteArray[number]
28
- readBytes(length: number): ByteArray
34
+ readBytes(length: number, size?: number): ByteArray
29
35
  readUint8(): number
30
36
  readUint16(): number
31
37
  readUint24(): number
32
38
  readUint32(): number
33
- setPosition(position: number): void
39
+ setPosition(position: number): () => void
40
+ _touch(): void
34
41
  }
35
42
 
36
43
  export type CreateCursorErrorType = ErrorType
@@ -51,6 +58,16 @@ const staticCursor: Cursor = {
51
58
  bytes: new Uint8Array(),
52
59
  dataView: new DataView(new ArrayBuffer(0)),
53
60
  position: 0,
61
+ positionReadCount: new Map(),
62
+ recursiveReadCount: 0,
63
+ recursiveReadLimit: Infinity,
64
+ assertReadLimit() {
65
+ if (this.recursiveReadCount >= this.recursiveReadLimit)
66
+ throw new RecursiveReadLimitExceededError({
67
+ count: this.recursiveReadCount + 1,
68
+ limit: this.recursiveReadLimit,
69
+ })
70
+ },
54
71
  assertPosition(position) {
55
72
  if (position < 0 || position > this.bytes.length - 1)
56
73
  throw new PositionOutOfBoundsError({
@@ -64,6 +81,9 @@ const staticCursor: Cursor = {
64
81
  this.assertPosition(position)
65
82
  this.position = position
66
83
  },
84
+ getReadCount(position) {
85
+ return this.positionReadCount.get(position || this.position) || 0
86
+ },
67
87
  incrementPosition(offset) {
68
88
  if (offset < 0) throw new NegativeOffsetError({ offset })
69
89
  const position = this.position + offset
@@ -135,48 +155,75 @@ const staticCursor: Cursor = {
135
155
  this.position += 4
136
156
  },
137
157
  readByte() {
158
+ this.assertReadLimit()
159
+ this._touch()
138
160
  const value = this.inspectByte()
139
161
  this.position++
140
162
  return value
141
163
  },
142
- readBytes(length) {
164
+ readBytes(length, size) {
165
+ this.assertReadLimit()
166
+ this._touch()
143
167
  const value = this.inspectBytes(length)
144
- this.position += length
168
+ this.position += size ?? length
145
169
  return value
146
170
  },
147
171
  readUint8() {
172
+ this.assertReadLimit()
173
+ this._touch()
148
174
  const value = this.inspectUint8()
149
175
  this.position += 1
150
176
  return value
151
177
  },
152
178
  readUint16() {
179
+ this.assertReadLimit()
180
+ this._touch()
153
181
  const value = this.inspectUint16()
154
182
  this.position += 2
155
183
  return value
156
184
  },
157
185
  readUint24() {
186
+ this.assertReadLimit()
187
+ this._touch()
158
188
  const value = this.inspectUint24()
159
189
  this.position += 3
160
190
  return value
161
191
  },
162
192
  readUint32() {
193
+ this.assertReadLimit()
194
+ this._touch()
163
195
  const value = this.inspectUint32()
164
196
  this.position += 4
165
197
  return value
166
198
  },
167
199
  setPosition(position) {
200
+ const oldPosition = this.position
168
201
  this.assertPosition(position)
169
202
  this.position = position
203
+ return () => (this.position = oldPosition)
204
+ },
205
+ _touch() {
206
+ if (this.recursiveReadLimit === Infinity) return
207
+ const count = this.getReadCount()
208
+ this.positionReadCount.set(this.position, count + 1)
209
+ if (count > 0) this.recursiveReadCount++
170
210
  },
171
211
  }
172
212
 
173
- export function createCursor(bytes: ByteArray): Cursor {
174
- const cursor = Object.create(staticCursor)
213
+ type CursorConfig = { recursiveReadLimit?: number }
214
+
215
+ export function createCursor(
216
+ bytes: ByteArray,
217
+ { recursiveReadLimit = 8_192 }: CursorConfig = {},
218
+ ): Cursor {
219
+ const cursor: Cursor = Object.create(staticCursor)
175
220
  cursor.bytes = bytes
176
221
  cursor.dataView = new DataView(
177
222
  bytes.buffer,
178
223
  bytes.byteOffset,
179
224
  bytes.byteLength,
180
225
  )
226
+ cursor.positionReadCount = new Map()
227
+ cursor.recursiveReadLimit = recursiveReadLimit
181
228
  return cursor
182
229
  }
@@ -119,7 +119,7 @@ export function bytesToBigInt(
119
119
  ): bigint {
120
120
  if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })
121
121
  const hex = bytesToHex(bytes, opts)
122
- return hexToBigInt(hex)
122
+ return hexToBigInt(hex, opts)
123
123
  }
124
124
 
125
125
  export type BytesToBoolOpts = {
@@ -187,7 +187,7 @@ export function bytesToNumber(
187
187
  ): number {
188
188
  if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })
189
189
  const hex = bytesToHex(bytes, opts)
190
- return hexToNumber(hex)
190
+ return hexToNumber(hex, opts)
191
191
  }
192
192
 
193
193
  export type BytesToStringOpts = {
@@ -41,7 +41,7 @@ export function fromRlp<to extends To = 'hex'>(
41
41
  return value
42
42
  })()
43
43
 
44
- const cursor = createCursor(bytes)
44
+ const cursor = createCursor(bytes, { recursiveReadLimit: Infinity })
45
45
  const result = fromRlpCursor(cursor, to)
46
46
 
47
47
  return result as FromRlpReturnType<to>