viem 0.0.1-alpha.24 → 0.0.1-alpha.25

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 (154) hide show
  1. package/contract/package.json +4 -0
  2. package/dist/call-ac509982.d.ts +23 -0
  3. package/dist/{chain-e33d019b.d.ts → chain-c4ccb458.d.ts} +1 -1
  4. package/dist/{chain-afa13f5a.d.ts → chain-f16512e8.d.ts} +20 -1
  5. package/dist/chains.d.ts +20 -8
  6. package/dist/chains.js +46 -46
  7. package/dist/chains.mjs +1 -1
  8. package/dist/{chunk-YQUC52RL.mjs → chunk-2Y3UZMSP.mjs} +77 -84
  9. package/dist/chunk-2Y3UZMSP.mjs.map +1 -0
  10. package/dist/{chunk-A2HXAZXC.js → chunk-CD2XJOBJ.js} +135 -142
  11. package/dist/chunk-CD2XJOBJ.js.map +1 -0
  12. package/dist/{chunk-LQVMDX5I.mjs → chunk-KSAO4Y4Q.mjs} +133 -54
  13. package/dist/chunk-KSAO4Y4Q.mjs.map +1 -0
  14. package/dist/{chunk-3ARWEJ3G.mjs → chunk-LEPQJNVO.mjs} +18 -2
  15. package/dist/chunk-LEPQJNVO.mjs.map +1 -0
  16. package/dist/{chunk-ZYSXBTBB.js → chunk-NUXMGPMK.js} +30 -14
  17. package/dist/chunk-NUXMGPMK.js.map +1 -0
  18. package/dist/{chunk-4D5XG6XB.js → chunk-THMRUG4D.js} +148 -69
  19. package/dist/chunk-THMRUG4D.js.map +1 -0
  20. package/dist/{contract-70f4ddbe.d.ts → contract-9e76e561.d.ts} +44 -31
  21. package/dist/contract.d.ts +123 -0
  22. package/dist/contract.js +53 -0
  23. package/dist/{clients/index.js.map → contract.js.map} +0 -0
  24. package/dist/contract.mjs +53 -0
  25. package/dist/{clients/index.mjs.map → contract.mjs.map} +0 -0
  26. package/dist/{createClient-60e3ab98.d.ts → createClient-68ee4bb4.d.ts} +3 -3
  27. package/dist/{createPublicClient-d3d12dc3.d.ts → createPublicClient-b732194e.d.ts} +3 -3
  28. package/dist/{createTestClient-5f4532c4.d.ts → createTestClient-dedf321e.d.ts} +3 -3
  29. package/dist/{createWalletClient-9ec3df4f.d.ts → createWalletClient-75813d83.d.ts} +3 -3
  30. package/dist/decodeErrorResult-0b934d23.d.ts +16 -0
  31. package/dist/{eip1193-9317a312.d.ts → eip1193-6f9ba163.d.ts} +1 -1
  32. package/dist/ens.d.ts +82 -1
  33. package/dist/ens.js +208 -3
  34. package/dist/ens.js.map +1 -1
  35. package/dist/ens.mjs +209 -4
  36. package/dist/ens.mjs.map +1 -1
  37. package/dist/getAbiItem-c8e6e7d4.d.ts +97 -0
  38. package/dist/index.d.ts +85 -175
  39. package/dist/index.js +237 -279
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +245 -287
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/public.d.ts +352 -10
  44. package/dist/public.js +3 -4
  45. package/dist/public.mjs +6 -7
  46. package/dist/readContract-4f6e2692.d.ts +10 -0
  47. package/dist/rpc-a5a7f376.d.ts +121 -0
  48. package/dist/{sendTransaction-54a0d509.d.ts → sendTransaction-e713f90c.d.ts} +3 -3
  49. package/dist/test.d.ts +160 -5
  50. package/dist/test.js +222 -18
  51. package/dist/test.js.map +1 -1
  52. package/dist/test.mjs +233 -29
  53. package/dist/test.mjs.map +1 -1
  54. package/dist/transactionReceipt-2a86c7c7.d.ts +26 -0
  55. package/dist/{transactionRequest-bdf57f7d.d.ts → transactionRequest-c7794f5e.d.ts} +1 -1
  56. package/dist/utils/index.d.ts +224 -20
  57. package/dist/utils/index.js +2 -6
  58. package/dist/utils/index.mjs +3 -7
  59. package/dist/wallet.d.ts +41 -7
  60. package/dist/wallet.js +3 -3
  61. package/dist/wallet.mjs +2 -2
  62. package/dist/watchEvent-c346c12d.d.ts +41 -0
  63. package/dist/window.d.ts +2 -2
  64. package/ens/package.json +4 -0
  65. package/package.json +13 -9
  66. package/src/_test/constants.ts +2 -0
  67. package/src/_test/utils.ts +10 -5
  68. package/src/actions/ens/getEnsAddress.bench.ts +26 -0
  69. package/src/actions/ens/getEnsAddress.test.ts +97 -0
  70. package/src/actions/ens/getEnsAddress.ts +122 -0
  71. package/src/actions/ens/getEnsName.bench.ts +30 -0
  72. package/src/actions/ens/getEnsName.test.ts +101 -0
  73. package/src/actions/ens/getEnsName.ts +106 -0
  74. package/src/actions/ens/index.test.ts +12 -0
  75. package/src/actions/ens/index.ts +3 -0
  76. package/src/actions/index.ts +3 -3
  77. package/src/actions/public/createEventFilter.test.ts +36 -4
  78. package/src/actions/public/createEventFilter.ts +27 -10
  79. package/src/actions/public/getFilterChanges.test.ts +198 -4
  80. package/src/actions/public/getFilterLogs.test.ts +195 -2
  81. package/src/actions/public/getLogs.test.ts +201 -2
  82. package/src/actions/public/index.test.ts +0 -1
  83. package/src/actions/public/index.ts +1 -7
  84. package/src/actions/public/multicall.ts +8 -3
  85. package/src/actions/public/simulateContract.ts +1 -4
  86. package/src/actions/public/watchContractEvent.test.ts +4 -4
  87. package/src/actions/{public → wallet}/deployContract.test.ts +1 -2
  88. package/src/actions/{public → wallet}/deployContract.ts +0 -0
  89. package/src/actions/wallet/index.test.ts +1 -0
  90. package/src/actions/wallet/index.ts +6 -0
  91. package/src/chains.test.ts +44 -1517
  92. package/src/clients/transports/webSocket.test.ts +1 -0
  93. package/src/clients/transports/webSocket.ts +1 -0
  94. package/src/contract.test.ts +31 -0
  95. package/src/contract.ts +68 -0
  96. package/src/ens.test.ts +15 -0
  97. package/src/ens.ts +4 -1
  98. package/src/errors/abi.ts +18 -2
  99. package/src/errors/chain.test.ts +46 -0
  100. package/src/errors/chain.ts +33 -0
  101. package/src/errors/contract.ts +2 -2
  102. package/src/errors/index.ts +3 -0
  103. package/src/index.test.ts +0 -147
  104. package/src/index.ts +0 -257
  105. package/src/public.test.ts +36 -0
  106. package/src/public.ts +2 -6
  107. package/src/test.test.ts +38 -0
  108. package/src/test.ts +1 -0
  109. package/src/types/contract.ts +144 -40
  110. package/src/types/index.ts +2 -1
  111. package/src/types/utils.ts +21 -0
  112. package/src/utils/abi/decodeErrorResult.test.ts +1 -1
  113. package/src/utils/abi/decodeEventLog.test.ts +542 -0
  114. package/src/utils/abi/decodeEventLog.ts +107 -0
  115. package/src/utils/abi/decodeFunctionData.test.ts +1 -2
  116. package/src/utils/abi/decodeFunctionData.ts +5 -2
  117. package/src/utils/abi/encodeFunctionData.ts +1 -4
  118. package/src/utils/abi/index.test.ts +1 -0
  119. package/src/utils/abi/index.ts +6 -0
  120. package/src/utils/ens/index.test.ts +1 -0
  121. package/src/utils/ens/index.ts +2 -0
  122. package/src/utils/ens/packetToBytes.test.ts +11 -0
  123. package/src/utils/ens/packetToBytes.ts +29 -0
  124. package/src/utils/index.test.ts +1 -3
  125. package/src/utils/index.ts +3 -2
  126. package/src/utils/rpc.test.ts +1 -0
  127. package/src/utils/rpc.ts +4 -2
  128. package/src/wallet.test.ts +19 -0
  129. package/wallet/package.json +4 -0
  130. package/clients/package.json +0 -4
  131. package/dist/chunk-3ARWEJ3G.mjs.map +0 -1
  132. package/dist/chunk-4D5XG6XB.js.map +0 -1
  133. package/dist/chunk-6QTEW2BE.mjs +0 -260
  134. package/dist/chunk-6QTEW2BE.mjs.map +0 -1
  135. package/dist/chunk-A2HXAZXC.js.map +0 -1
  136. package/dist/chunk-KRPS5CIB.mjs +0 -256
  137. package/dist/chunk-KRPS5CIB.mjs.map +0 -1
  138. package/dist/chunk-LQVMDX5I.mjs.map +0 -1
  139. package/dist/chunk-N3IOPT3R.js +0 -256
  140. package/dist/chunk-N3IOPT3R.js.map +0 -1
  141. package/dist/chunk-YQUC52RL.mjs.map +0 -1
  142. package/dist/chunk-ZSTVHQ6J.js +0 -260
  143. package/dist/chunk-ZSTVHQ6J.js.map +0 -1
  144. package/dist/chunk-ZYSXBTBB.js.map +0 -1
  145. package/dist/clients/index.d.ts +0 -9
  146. package/dist/clients/index.js +0 -24
  147. package/dist/clients/index.mjs +0 -24
  148. package/dist/normalize-ef9240c0.d.ts +0 -33
  149. package/dist/parseGwei-492ab7dd.d.ts +0 -355
  150. package/dist/rpc-26932bae.d.ts +0 -61
  151. package/dist/stopImpersonatingAccount-c1a4b7e5.d.ts +0 -156
  152. package/dist/watchAsset-d59d6e35.d.ts +0 -38
  153. package/dist/watchPendingTransactions-ea21b31d.d.ts +0 -373
  154. package/dist/webSocket-775b4037.d.ts +0 -83
@@ -0,0 +1,542 @@
1
+ import { assertType, expect, test } from 'vitest'
2
+ import { getAddress } from '../address'
3
+ import { decodeEventLog } from './decodeEventLog'
4
+
5
+ test('Transfer()', () => {
6
+ const event = decodeEventLog({
7
+ abi: [
8
+ {
9
+ inputs: [],
10
+ name: 'Transfer',
11
+ type: 'event',
12
+ },
13
+ {
14
+ inputs: [],
15
+ name: 'Approve',
16
+ type: 'event',
17
+ },
18
+ ],
19
+ topics: [
20
+ '0x406dade31f7ae4b5dbc276258c28dde5ae6d5c2773c5745802c493a2360e55e0',
21
+ ],
22
+ })
23
+ assertType<typeof event>({ eventName: 'Transfer' })
24
+ expect(event).toEqual({
25
+ eventName: 'Transfer',
26
+ })
27
+ })
28
+
29
+ test('no args: Transfer(address,address,uint256)', () => {
30
+ const event = decodeEventLog({
31
+ abi: [
32
+ {
33
+ inputs: [
34
+ {
35
+ indexed: true,
36
+ name: 'from',
37
+ type: 'address',
38
+ },
39
+ {
40
+ indexed: true,
41
+ name: 'to',
42
+ type: 'address',
43
+ },
44
+ {
45
+ indexed: false,
46
+ name: 'tokenId',
47
+ type: 'uint256',
48
+ },
49
+ ],
50
+ name: 'Transfer',
51
+ type: 'event',
52
+ },
53
+ ],
54
+ topics: [
55
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
56
+ ],
57
+ })
58
+ assertType<typeof event>({ eventName: 'Transfer' })
59
+ expect(event).toEqual({
60
+ eventName: 'Transfer',
61
+ })
62
+ })
63
+
64
+ test('named args: Transfer(address,address,uint256)', () => {
65
+ const event = decodeEventLog({
66
+ abi: [
67
+ {
68
+ inputs: [
69
+ {
70
+ indexed: true,
71
+ name: 'from',
72
+ type: 'address',
73
+ },
74
+ {
75
+ indexed: true,
76
+ name: 'to',
77
+ type: 'address',
78
+ },
79
+ {
80
+ indexed: false,
81
+ name: 'tokenId',
82
+ type: 'uint256',
83
+ },
84
+ ],
85
+ name: 'Transfer',
86
+ type: 'event',
87
+ },
88
+ ],
89
+ topics: [
90
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
91
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
92
+ ],
93
+ })
94
+ assertType<typeof event>({ eventName: 'Transfer', args: { from: '0x' } })
95
+ expect(event).toEqual({
96
+ eventName: 'Transfer',
97
+ args: {
98
+ from: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
99
+ },
100
+ })
101
+ })
102
+
103
+ test('named args: Transfer(address,address,uint256)', () => {
104
+ const event = decodeEventLog({
105
+ abi: [
106
+ {
107
+ inputs: [
108
+ {
109
+ indexed: true,
110
+ name: 'from',
111
+ type: 'address',
112
+ },
113
+ {
114
+ indexed: true,
115
+ name: 'to',
116
+ type: 'address',
117
+ },
118
+ {
119
+ indexed: false,
120
+ name: 'tokenId',
121
+ type: 'uint256',
122
+ },
123
+ ],
124
+ name: 'Transfer',
125
+ type: 'event',
126
+ },
127
+ ],
128
+ topics: [
129
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
130
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
131
+ [],
132
+ ],
133
+ })
134
+ assertType<typeof event>({
135
+ eventName: 'Transfer',
136
+ args: { from: '0x', to: [] },
137
+ })
138
+ expect(event).toEqual({
139
+ eventName: 'Transfer',
140
+ args: {
141
+ from: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
142
+ to: [],
143
+ },
144
+ })
145
+ })
146
+
147
+ test('named args: Transfer(address,address,uint256)', () => {
148
+ const event = decodeEventLog({
149
+ abi: [
150
+ {
151
+ inputs: [
152
+ {
153
+ indexed: true,
154
+ name: 'from',
155
+ type: 'address',
156
+ },
157
+ {
158
+ indexed: true,
159
+ name: 'to',
160
+ type: 'address',
161
+ },
162
+ {
163
+ indexed: false,
164
+ name: 'tokenId',
165
+ type: 'uint256',
166
+ },
167
+ ],
168
+ name: 'Transfer',
169
+ type: 'event',
170
+ },
171
+ ],
172
+ topics: [
173
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
174
+ null,
175
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
176
+ ],
177
+ })
178
+ assertType<typeof event>({
179
+ eventName: 'Transfer',
180
+ args: { from: null, to: '0x' },
181
+ })
182
+ expect(event).toEqual({
183
+ eventName: 'Transfer',
184
+ args: {
185
+ from: null,
186
+ to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
187
+ },
188
+ })
189
+ })
190
+
191
+ test('named args: Transfer(address,address,uint256)', () => {
192
+ const event = decodeEventLog({
193
+ abi: [
194
+ {
195
+ inputs: [
196
+ {
197
+ indexed: true,
198
+ name: 'from',
199
+ type: 'address',
200
+ },
201
+ {
202
+ indexed: true,
203
+ name: 'to',
204
+ type: 'address',
205
+ },
206
+ {
207
+ indexed: false,
208
+ name: 'tokenId',
209
+ type: 'uint256',
210
+ },
211
+ ],
212
+ name: 'Transfer',
213
+ type: 'event',
214
+ },
215
+ ],
216
+ topics: [
217
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
218
+ null,
219
+ [
220
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
221
+ '0x000000000000000000000000c961145a54c96e3ae9baa048c4f4d6b04c13916b',
222
+ ],
223
+ ],
224
+ })
225
+ assertType<typeof event>({
226
+ eventName: 'Transfer',
227
+ args: { from: null, to: ['0x', '0x'] },
228
+ })
229
+ expect(event).toEqual({
230
+ args: {
231
+ from: null,
232
+ to: [
233
+ '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
234
+ '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b',
235
+ ],
236
+ },
237
+ eventName: 'Transfer',
238
+ })
239
+ })
240
+
241
+ test('unnamed args: Transfer(address,address,uint256)', () => {
242
+ const event = decodeEventLog({
243
+ abi: [
244
+ {
245
+ inputs: [
246
+ {
247
+ indexed: true,
248
+ type: 'address',
249
+ },
250
+ {
251
+ indexed: true,
252
+ type: 'address',
253
+ },
254
+ {
255
+ indexed: false,
256
+ type: 'uint256',
257
+ },
258
+ ],
259
+ name: 'Transfer',
260
+ type: 'event',
261
+ },
262
+ ],
263
+ topics: [
264
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
265
+ null,
266
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
267
+ ],
268
+ })
269
+ assertType<typeof event>({ eventName: 'Transfer', args: [null, '0x'] })
270
+ expect(event).toEqual({
271
+ args: [null, '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],
272
+ eventName: 'Transfer',
273
+ })
274
+ })
275
+
276
+ test('unnamed args: Transfer(address,address,uint256)', () => {
277
+ const event = decodeEventLog({
278
+ abi: [
279
+ {
280
+ inputs: [
281
+ {
282
+ indexed: true,
283
+ type: 'address',
284
+ },
285
+ {
286
+ indexed: true,
287
+ type: 'address',
288
+ },
289
+ {
290
+ indexed: false,
291
+ type: 'uint256',
292
+ },
293
+ ],
294
+ name: 'Transfer',
295
+ type: 'event',
296
+ },
297
+ ],
298
+ topics: [
299
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
300
+ null,
301
+ [
302
+ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac',
303
+ '0x000000000000000000000000c961145a54c96e3ae9baa048c4f4d6b04c13916b',
304
+ ],
305
+ ],
306
+ })
307
+ assertType<typeof event>({
308
+ eventName: 'Transfer',
309
+ args: [null, ['0x', '0x']],
310
+ })
311
+ expect(event).toEqual({
312
+ args: [
313
+ null,
314
+ [
315
+ '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
316
+ '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b',
317
+ ],
318
+ ],
319
+ eventName: 'Transfer',
320
+ })
321
+ })
322
+
323
+ test('Foo(string)', () => {
324
+ const event = decodeEventLog({
325
+ abi: [
326
+ {
327
+ inputs: [
328
+ {
329
+ indexed: true,
330
+ name: 'message',
331
+ type: 'string',
332
+ },
333
+ ],
334
+ name: 'Foo',
335
+ type: 'event',
336
+ },
337
+ ],
338
+ topics: [
339
+ '0x9f0b7f1630bdb7d474466e2dfef0fb9dff65f7a50eec83935b68f77d0808f08a',
340
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
341
+ ],
342
+ })
343
+ assertType<typeof event>({
344
+ eventName: 'Foo',
345
+ args: {
346
+ message:
347
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
348
+ },
349
+ })
350
+ expect(event).toEqual({
351
+ args: {
352
+ message:
353
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
354
+ },
355
+ eventName: 'Foo',
356
+ })
357
+ })
358
+
359
+ test('args: eventName', () => {
360
+ const event = decodeEventLog({
361
+ abi: [
362
+ {
363
+ inputs: [
364
+ {
365
+ indexed: true,
366
+ type: 'address',
367
+ },
368
+ {
369
+ indexed: true,
370
+ type: 'address',
371
+ },
372
+ {
373
+ indexed: false,
374
+ type: 'uint256',
375
+ },
376
+ ],
377
+ name: 'Transfer',
378
+ type: 'event',
379
+ },
380
+ {
381
+ inputs: [
382
+ {
383
+ indexed: true,
384
+ name: 'message',
385
+ type: 'string',
386
+ },
387
+ ],
388
+ name: 'Foo',
389
+ type: 'event',
390
+ },
391
+ ],
392
+ eventName: 'Foo',
393
+ topics: [
394
+ '0x9f0b7f1630bdb7d474466e2dfef0fb9dff65f7a50eec83935b68f77d0808f08a',
395
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
396
+ ],
397
+ })
398
+ assertType<typeof event>({
399
+ eventName: 'Foo',
400
+ args: {
401
+ message:
402
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
403
+ },
404
+ })
405
+ expect(event).toEqual({
406
+ args: {
407
+ message:
408
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
409
+ },
410
+ eventName: 'Foo',
411
+ })
412
+ })
413
+
414
+ test('args: data', () => {
415
+ const event = decodeEventLog({
416
+ abi: [
417
+ {
418
+ inputs: [
419
+ {
420
+ indexed: true,
421
+ name: 'from',
422
+ type: 'address',
423
+ },
424
+ {
425
+ indexed: true,
426
+ name: 'to',
427
+ type: 'address',
428
+ },
429
+ {
430
+ indexed: false,
431
+ name: 'tokenId',
432
+ type: 'uint256',
433
+ },
434
+ ],
435
+ name: 'Transfer',
436
+ type: 'event',
437
+ },
438
+ ],
439
+ data: '0x0000000000000000000000000000000000000000000000000000000000000001',
440
+ eventName: 'Transfer',
441
+ topics: [
442
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
443
+ '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045',
444
+ '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266',
445
+ ],
446
+ })
447
+ assertType<typeof event>({
448
+ eventName: 'Transfer',
449
+ args: {
450
+ from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
451
+ to: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
452
+ tokenId: 1n,
453
+ },
454
+ })
455
+ expect(event).toEqual({
456
+ eventName: 'Transfer',
457
+ args: {
458
+ from: getAddress('0xd8da6bf26964af9d7eed9e03e53415d37aa96045'),
459
+ to: getAddress('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'),
460
+ tokenId: 1n,
461
+ },
462
+ })
463
+ })
464
+
465
+ test('args: data', () => {
466
+ const event = decodeEventLog({
467
+ abi: [
468
+ {
469
+ inputs: [
470
+ {
471
+ indexed: true,
472
+ type: 'address',
473
+ },
474
+ {
475
+ indexed: true,
476
+ type: 'address',
477
+ },
478
+ {
479
+ indexed: false,
480
+ type: 'uint256',
481
+ },
482
+ ],
483
+ name: 'Transfer',
484
+ type: 'event',
485
+ },
486
+ ],
487
+ data: '0x0000000000000000000000000000000000000000000000000000000000000001',
488
+ eventName: 'Transfer',
489
+ topics: [
490
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
491
+ '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045',
492
+ '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266',
493
+ ],
494
+ })
495
+ assertType<typeof event>({
496
+ eventName: 'Transfer',
497
+ args: [
498
+ '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
499
+ '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
500
+ 1n,
501
+ ],
502
+ })
503
+ expect(event).toEqual({
504
+ eventName: 'Transfer',
505
+ args: [
506
+ getAddress('0xd8da6bf26964af9d7eed9e03e53415d37aa96045'),
507
+ getAddress('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'),
508
+ 1n,
509
+ ],
510
+ })
511
+ })
512
+
513
+ test("errors: event doesn't exist", () => {
514
+ expect(() =>
515
+ decodeEventLog({
516
+ abi: [
517
+ {
518
+ inputs: [
519
+ {
520
+ indexed: true,
521
+ name: 'message',
522
+ type: 'string',
523
+ },
524
+ ],
525
+ name: 'Bar',
526
+ type: 'event',
527
+ },
528
+ ],
529
+ topics: [
530
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
531
+ '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8',
532
+ ],
533
+ }),
534
+ ).toThrowErrorMatchingInlineSnapshot(`
535
+ "Encoded event signature \\"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\\" not found on ABI.
536
+ Make sure you are using the correct ABI and that the event exists on it.
537
+ You can look up the signature here: https://openchain.xyz/signatures?query=0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
538
+
539
+ Docs: https://viem.sh/docs/contract/decodeEventLog
540
+ Version: viem@1.0.2"
541
+ `)
542
+ })
@@ -0,0 +1,107 @@
1
+ import { Abi, AbiParameter, Narrow } from 'abitype'
2
+ import { AbiEventSignatureNotFoundError } from '../../errors'
3
+ import {
4
+ EventDefinition,
5
+ ExtractEventArgsFromTopics,
6
+ ExtractEventNameFromAbi,
7
+ Hex,
8
+ LogTopic,
9
+ } from '../../types'
10
+ import { getEventSignature } from '../hash'
11
+ import { decodeAbi } from './decodeAbi'
12
+ import { formatAbiItem } from './formatAbiItem'
13
+
14
+ export type DecodeEventLogArgs<
15
+ TAbi extends Abi | readonly unknown[] = Abi,
16
+ TEventName extends string = string,
17
+ TTopics extends LogTopic[] = LogTopic[],
18
+ TData extends Hex | undefined = undefined,
19
+ > = {
20
+ abi: Narrow<TAbi>
21
+ data?: TData
22
+ eventName?: ExtractEventNameFromAbi<TAbi, TEventName>
23
+ topics: [signature: Hex, ...args: TTopics]
24
+ }
25
+
26
+ export type DecodeEventLogResponse<
27
+ TAbi extends Abi | readonly unknown[] = Abi,
28
+ TEventName extends string = string,
29
+ TTopics extends LogTopic[] = LogTopic[],
30
+ TData extends Hex | undefined = undefined,
31
+ > = {
32
+ eventName: TEventName
33
+ } & ExtractEventArgsFromTopics<TAbi, TEventName, TTopics, TData>
34
+
35
+ export function decodeEventLog<
36
+ TAbi extends Abi | readonly unknown[],
37
+ TEventName extends string,
38
+ TTopics extends LogTopic[],
39
+ TData extends Hex | undefined = undefined,
40
+ >({
41
+ abi,
42
+ data,
43
+ topics,
44
+ }: DecodeEventLogArgs<
45
+ TAbi,
46
+ TEventName,
47
+ TTopics,
48
+ TData
49
+ >): DecodeEventLogResponse<TAbi, TEventName, TTopics, TData> {
50
+ const [signature, ...argTopics] = topics
51
+ const abiItem = (abi as Abi).find(
52
+ (x) => signature === getEventSignature(formatAbiItem(x) as EventDefinition),
53
+ )
54
+ if (!(abiItem && 'name' in abiItem))
55
+ throw new AbiEventSignatureNotFoundError(signature, {
56
+ docsPath: '/docs/contract/decodeEventLog',
57
+ })
58
+
59
+ const { name, inputs } = abiItem
60
+ const isUnnamed = inputs?.some((x) => !('name' in x && x.name))
61
+
62
+ let args: any = isUnnamed ? [] : {}
63
+
64
+ // Decode topics (indexed args).
65
+ for (let i = 0; i < inputs.length; i++) {
66
+ const param = inputs[i]
67
+ const topic = argTopics[i]
68
+ if (topic === null) args[param.name || i] = null
69
+ if (!topic) continue
70
+ if (Array.isArray(topic)) {
71
+ args[param.name || i] = topic.map((t) => decodeTopic({ param, value: t }))
72
+ } else {
73
+ args[param.name || i] = decodeTopic({ param, value: topic })
74
+ }
75
+ }
76
+
77
+ // Decode data (non-indexed args).
78
+ if (data) {
79
+ const params = inputs.filter((x) => !('indexed' in x && x.indexed))
80
+ const decodedData = decodeAbi({ params, data })
81
+ if (decodedData) {
82
+ if (isUnnamed) args = [...args, ...decodedData]
83
+ else {
84
+ for (let i = 0; i < params.length; i++) {
85
+ args[params[i].name!] = decodedData[i]
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ return {
92
+ eventName: name,
93
+ args: Object.values(args).length > 0 ? args : undefined,
94
+ } as unknown as DecodeEventLogResponse<TAbi, TEventName, TTopics, TData>
95
+ }
96
+
97
+ function decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {
98
+ if (
99
+ param.type === 'string' ||
100
+ param.type === 'bytes' ||
101
+ param.type === 'tuple' ||
102
+ param.type.match(/^(.*)\[(\d+)?\]$/)
103
+ )
104
+ return value
105
+ const decodedArg = decodeAbi({ params: [param], data: value }) || []
106
+ return decodedArg[0]
107
+ }
@@ -19,7 +19,6 @@ test('foo()', () => {
19
19
  ).toEqual({ args: undefined, functionName: 'foo' })
20
20
  expect(
21
21
  decodeFunctionData({
22
- // @ts-expect-error
23
22
  abi: [
24
23
  {
25
24
  name: 'foo',
@@ -131,7 +130,7 @@ test("errors: function doesn't exist", () => {
131
130
  ).toThrowErrorMatchingInlineSnapshot(`
132
131
  "Encoded function signature \\"0xa3741467\\" not found on ABI.
133
132
  Make sure you are using the correct ABI and that the function exists on it.
134
- You can look up the signature \\"0xa3741467\\" here: https://sig.eth.samczsun.com/.
133
+ You can look up the signature here: https://openchain.xyz/signatures?query=0xa3741467.
135
134
 
136
135
  Docs: https://viem.sh/docs/contract/decodeFunctionData
137
136
  Version: viem@1.0.2"
@@ -7,11 +7,14 @@ import { getFunctionSignature } from '../hash'
7
7
  import { decodeAbi } from './decodeAbi'
8
8
  import { formatAbiItem } from './formatAbiItem'
9
9
 
10
- export type DecodeFunctionDataArgs = { abi: Abi; data: Hex }
10
+ export type DecodeFunctionDataArgs = {
11
+ abi: Abi | readonly unknown[]
12
+ data: Hex
13
+ }
11
14
 
12
15
  export function decodeFunctionData({ abi, data }: DecodeFunctionDataArgs) {
13
16
  const signature = slice(data, 0, 4)
14
- const description = abi.find(
17
+ const description = (abi as Abi).find(
15
18
  (x) => signature === getFunctionSignature(formatAbiItem(x)),
16
19
  )
17
20
  if (!description)
@@ -1,9 +1,6 @@
1
1
  import { Abi, Narrow } from 'abitype'
2
2
 
3
- import {
4
- AbiEncodingLengthMismatchError,
5
- AbiFunctionNotFoundError,
6
- } from '../../errors'
3
+ import { AbiFunctionNotFoundError } from '../../errors'
7
4
  import { ExtractArgsFromAbi, ExtractFunctionNameFromAbi } from '../../types'
8
5
  import { concatHex } from '../data'
9
6
  import { getFunctionSignature } from '../hash'
@@ -7,6 +7,7 @@ test('exports utils', () => {
7
7
  {
8
8
  "decodeAbi": [Function],
9
9
  "decodeErrorResult": [Function],
10
+ "decodeEventLog": [Function],
10
11
  "decodeFunctionData": [Function],
11
12
  "decodeFunctionResult": [Function],
12
13
  "encodeAbi": [Function],
@@ -7,6 +7,12 @@ export type {
7
7
  } from './decodeErrorResult'
8
8
  export { decodeErrorResult } from './decodeErrorResult'
9
9
 
10
+ export type {
11
+ DecodeEventLogArgs,
12
+ DecodeEventLogResponse,
13
+ } from './decodeEventLog'
14
+ export { decodeEventLog } from './decodeEventLog'
15
+
10
16
  export type { DecodeFunctionDataArgs } from './decodeFunctionData'
11
17
  export { decodeFunctionData } from './decodeFunctionData'
12
18