viem 2.23.2 → 2.23.3

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 (183) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/_cjs/chains/definitions/b3.js +6 -0
  3. package/_cjs/chains/definitions/b3.js.map +1 -1
  4. package/_cjs/chains/definitions/b3Sepolia.js +6 -0
  5. package/_cjs/chains/definitions/b3Sepolia.js.map +1 -1
  6. package/_cjs/chains/definitions/berachainTestnet.js +6 -0
  7. package/_cjs/chains/definitions/berachainTestnet.js.map +1 -1
  8. package/_cjs/chains/definitions/donatuz.js +1 -1
  9. package/_cjs/chains/definitions/donatuz.js.map +1 -1
  10. package/_cjs/chains/definitions/hashkeyChainTestnet.js +1 -0
  11. package/_cjs/chains/definitions/hashkeyChainTestnet.js.map +1 -1
  12. package/_cjs/chains/definitions/haustTestnet.js +26 -0
  13. package/_cjs/chains/definitions/haustTestnet.js.map +1 -0
  14. package/_cjs/chains/definitions/lumoz.js +26 -0
  15. package/_cjs/chains/definitions/lumoz.js.map +1 -0
  16. package/_cjs/chains/definitions/lumozTestnet.js +20 -0
  17. package/_cjs/chains/definitions/lumozTestnet.js.map +1 -0
  18. package/_cjs/chains/definitions/newton.js +26 -0
  19. package/_cjs/chains/definitions/newton.js.map +1 -0
  20. package/_cjs/chains/definitions/peaq.js +41 -0
  21. package/_cjs/chains/definitions/peaq.js.map +1 -0
  22. package/_cjs/chains/definitions/polynomial.js +31 -0
  23. package/_cjs/chains/definitions/polynomial.js.map +1 -0
  24. package/_cjs/chains/definitions/polynomialSepolia.js +31 -0
  25. package/_cjs/chains/definitions/polynomialSepolia.js.map +1 -0
  26. package/_cjs/chains/definitions/story.js +7 -0
  27. package/_cjs/chains/definitions/story.js.map +1 -1
  28. package/_cjs/chains/definitions/storyAeneid.js +31 -0
  29. package/_cjs/chains/definitions/storyAeneid.js.map +1 -0
  30. package/_cjs/chains/definitions/worldchain.js +1 -1
  31. package/_cjs/chains/index.js +23 -7
  32. package/_cjs/chains/index.js.map +1 -1
  33. package/_cjs/errors/version.js +1 -1
  34. package/_cjs/op-stack/abis.js +7 -96
  35. package/_cjs/op-stack/abis.js.map +1 -1
  36. package/_cjs/op-stack/actions/getWithdrawalStatus.js +21 -14
  37. package/_cjs/op-stack/actions/getWithdrawalStatus.js.map +1 -1
  38. package/_cjs/zksync/actions/finalizeWithdrawal.js +99 -0
  39. package/_cjs/zksync/actions/finalizeWithdrawal.js.map +1 -0
  40. package/_cjs/zksync/constants/abis.js +724 -1
  41. package/_cjs/zksync/constants/abis.js.map +1 -1
  42. package/_cjs/zksync/constants/address.js +2 -1
  43. package/_cjs/zksync/constants/address.js.map +1 -1
  44. package/_cjs/zksync/decorators/walletL1.js +2 -0
  45. package/_cjs/zksync/decorators/walletL1.js.map +1 -1
  46. package/_cjs/zksync/errors/bridge.js +11 -1
  47. package/_cjs/zksync/errors/bridge.js.map +1 -1
  48. package/_cjs/zksync/index.js +4 -2
  49. package/_cjs/zksync/index.js.map +1 -1
  50. package/_cjs/zksync/utils/bridge/getWithdrawalL2ToL1Log.js +19 -0
  51. package/_cjs/zksync/utils/bridge/getWithdrawalL2ToL1Log.js.map +1 -0
  52. package/_cjs/zksync/utils/bridge/getWithdrawalLog.js +19 -0
  53. package/_cjs/zksync/utils/bridge/getWithdrawalLog.js.map +1 -0
  54. package/_esm/chains/definitions/b3.js +6 -0
  55. package/_esm/chains/definitions/b3.js.map +1 -1
  56. package/_esm/chains/definitions/b3Sepolia.js +6 -0
  57. package/_esm/chains/definitions/b3Sepolia.js.map +1 -1
  58. package/_esm/chains/definitions/berachainTestnet.js +6 -0
  59. package/_esm/chains/definitions/berachainTestnet.js.map +1 -1
  60. package/_esm/chains/definitions/donatuz.js +1 -1
  61. package/_esm/chains/definitions/donatuz.js.map +1 -1
  62. package/_esm/chains/definitions/hashkeyChainTestnet.js +1 -0
  63. package/_esm/chains/definitions/hashkeyChainTestnet.js.map +1 -1
  64. package/_esm/chains/definitions/haustTestnet.js +23 -0
  65. package/_esm/chains/definitions/haustTestnet.js.map +1 -0
  66. package/_esm/chains/definitions/lumoz.js +23 -0
  67. package/_esm/chains/definitions/lumoz.js.map +1 -0
  68. package/_esm/chains/definitions/lumozTestnet.js +17 -0
  69. package/_esm/chains/definitions/lumozTestnet.js.map +1 -0
  70. package/_esm/chains/definitions/newton.js +23 -0
  71. package/_esm/chains/definitions/newton.js.map +1 -0
  72. package/_esm/chains/definitions/peaq.js +38 -0
  73. package/_esm/chains/definitions/peaq.js.map +1 -0
  74. package/_esm/chains/definitions/polynomial.js +28 -0
  75. package/_esm/chains/definitions/polynomial.js.map +1 -0
  76. package/_esm/chains/definitions/polynomialSepolia.js +28 -0
  77. package/_esm/chains/definitions/polynomialSepolia.js.map +1 -0
  78. package/_esm/chains/definitions/story.js +7 -0
  79. package/_esm/chains/definitions/story.js.map +1 -1
  80. package/_esm/chains/definitions/storyAeneid.js +28 -0
  81. package/_esm/chains/definitions/storyAeneid.js.map +1 -0
  82. package/_esm/chains/definitions/worldchain.js +1 -1
  83. package/_esm/chains/index.js +10 -0
  84. package/_esm/chains/index.js.map +1 -1
  85. package/_esm/errors/version.js +1 -1
  86. package/_esm/op-stack/abis.js +7 -96
  87. package/_esm/op-stack/abis.js.map +1 -1
  88. package/_esm/op-stack/actions/getWithdrawalStatus.js +25 -14
  89. package/_esm/op-stack/actions/getWithdrawalStatus.js.map +1 -1
  90. package/_esm/zksync/actions/finalizeWithdrawal.js +147 -0
  91. package/_esm/zksync/actions/finalizeWithdrawal.js.map +1 -0
  92. package/_esm/zksync/constants/abis.js +723 -0
  93. package/_esm/zksync/constants/abis.js.map +1 -1
  94. package/_esm/zksync/constants/address.js +1 -0
  95. package/_esm/zksync/constants/address.js.map +1 -1
  96. package/_esm/zksync/decorators/walletL1.js +2 -0
  97. package/_esm/zksync/decorators/walletL1.js.map +1 -1
  98. package/_esm/zksync/errors/bridge.js +9 -0
  99. package/_esm/zksync/errors/bridge.js.map +1 -1
  100. package/_esm/zksync/index.js +1 -0
  101. package/_esm/zksync/index.js.map +1 -1
  102. package/_esm/zksync/utils/bridge/getWithdrawalL2ToL1Log.js +17 -0
  103. package/_esm/zksync/utils/bridge/getWithdrawalL2ToL1Log.js.map +1 -0
  104. package/_esm/zksync/utils/bridge/getWithdrawalLog.js +17 -0
  105. package/_esm/zksync/utils/bridge/getWithdrawalLog.js.map +1 -0
  106. package/_types/chains/definitions/b3.d.ts +6 -10
  107. package/_types/chains/definitions/b3.d.ts.map +1 -1
  108. package/_types/chains/definitions/b3Sepolia.d.ts +6 -10
  109. package/_types/chains/definitions/b3Sepolia.d.ts.map +1 -1
  110. package/_types/chains/definitions/berachainTestnet.d.ts +6 -10
  111. package/_types/chains/definitions/berachainTestnet.d.ts.map +1 -1
  112. package/_types/chains/definitions/donatuz.d.ts +1 -1
  113. package/_types/chains/definitions/hashkeyChainTestnet.d.ts +1 -1
  114. package/_types/chains/definitions/hashkeyChainTestnet.d.ts.map +1 -1
  115. package/_types/chains/definitions/haustTestnet.d.ts +37 -0
  116. package/_types/chains/definitions/haustTestnet.d.ts.map +1 -0
  117. package/_types/chains/definitions/lumoz.d.ts +37 -0
  118. package/_types/chains/definitions/lumoz.d.ts.map +1 -0
  119. package/_types/chains/definitions/lumozTestnet.d.ts +43 -0
  120. package/_types/chains/definitions/lumozTestnet.d.ts.map +1 -0
  121. package/_types/chains/definitions/newton.d.ts +37 -0
  122. package/_types/chains/definitions/newton.d.ts.map +1 -0
  123. package/_types/chains/definitions/peaq.d.ts +34 -0
  124. package/_types/chains/definitions/peaq.d.ts.map +1 -0
  125. package/_types/chains/definitions/polynomial.d.ts +32 -0
  126. package/_types/chains/definitions/polynomial.d.ts.map +1 -0
  127. package/_types/chains/definitions/polynomialSepolia.d.ts +32 -0
  128. package/_types/chains/definitions/polynomialSepolia.d.ts.map +1 -0
  129. package/_types/chains/definitions/story.d.ts +6 -11
  130. package/_types/chains/definitions/story.d.ts.map +1 -1
  131. package/_types/chains/definitions/storyAeneid.d.ts +34 -0
  132. package/_types/chains/definitions/storyAeneid.d.ts.map +1 -0
  133. package/_types/chains/definitions/worldchain.d.ts +1 -1
  134. package/_types/chains/index.d.ts +10 -0
  135. package/_types/chains/index.d.ts.map +1 -1
  136. package/_types/errors/version.d.ts +1 -1
  137. package/_types/op-stack/abis.d.ts +7 -77
  138. package/_types/op-stack/abis.d.ts.map +1 -1
  139. package/_types/op-stack/actions/getWithdrawalStatus.d.ts.map +1 -1
  140. package/_types/zksync/actions/finalizeWithdrawal.d.ts +73 -0
  141. package/_types/zksync/actions/finalizeWithdrawal.d.ts.map +1 -0
  142. package/_types/zksync/constants/abis.d.ts +567 -0
  143. package/_types/zksync/constants/abis.d.ts.map +1 -1
  144. package/_types/zksync/constants/address.d.ts +1 -0
  145. package/_types/zksync/constants/address.d.ts.map +1 -1
  146. package/_types/zksync/decorators/walletL1.d.ts +31 -0
  147. package/_types/zksync/decorators/walletL1.d.ts.map +1 -1
  148. package/_types/zksync/errors/bridge.d.ts +9 -0
  149. package/_types/zksync/errors/bridge.d.ts.map +1 -1
  150. package/_types/zksync/index.d.ts +1 -0
  151. package/_types/zksync/index.d.ts.map +1 -1
  152. package/_types/zksync/utils/bridge/getWithdrawalL2ToL1Log.d.ts +20 -0
  153. package/_types/zksync/utils/bridge/getWithdrawalL2ToL1Log.d.ts.map +1 -0
  154. package/_types/zksync/utils/bridge/getWithdrawalLog.d.ts +20 -0
  155. package/_types/zksync/utils/bridge/getWithdrawalLog.d.ts.map +1 -0
  156. package/chains/definitions/b3.ts +6 -0
  157. package/chains/definitions/b3Sepolia.ts +6 -0
  158. package/chains/definitions/berachainTestnet.ts +6 -0
  159. package/chains/definitions/donatuz.ts +1 -1
  160. package/chains/definitions/hashkeyChainTestnet.ts +1 -0
  161. package/chains/definitions/haustTestnet.ts +23 -0
  162. package/chains/definitions/lumoz.ts +23 -0
  163. package/chains/definitions/lumozTestnet.ts +17 -0
  164. package/chains/definitions/newton.ts +23 -0
  165. package/chains/definitions/peaq.ts +38 -0
  166. package/chains/definitions/polynomial.ts +28 -0
  167. package/chains/definitions/polynomialSepolia.ts +28 -0
  168. package/chains/definitions/story.ts +7 -0
  169. package/chains/definitions/storyAeneid.ts +28 -0
  170. package/chains/definitions/worldchain.ts +1 -1
  171. package/chains/index.ts +10 -0
  172. package/errors/version.ts +1 -1
  173. package/op-stack/abis.ts +7 -96
  174. package/op-stack/actions/getWithdrawalStatus.ts +28 -17
  175. package/package.json +1 -1
  176. package/zksync/actions/finalizeWithdrawal.ts +248 -0
  177. package/zksync/constants/abis.ts +724 -0
  178. package/zksync/constants/address.ts +3 -0
  179. package/zksync/decorators/walletL1.ts +48 -0
  180. package/zksync/errors/bridge.ts +17 -0
  181. package/zksync/index.ts +6 -0
  182. package/zksync/utils/bridge/getWithdrawalL2ToL1Log.ts +47 -0
  183. package/zksync/utils/bridge/getWithdrawalLog.ts +47 -0
@@ -249,27 +249,38 @@ export async function getWithdrawalStatus<
249
249
  if (checkWithdrawalResult.status === 'rejected') {
250
250
  const error = checkWithdrawalResult.reason as ReadContractErrorType
251
251
  if (error.cause instanceof ContractFunctionRevertedError) {
252
- const errorMessage = error.cause.data?.args?.[0]
253
- if (
254
- errorMessage === 'OptimismPortal: invalid game type' ||
255
- errorMessage === 'OptimismPortal: withdrawal has not been proven yet' ||
256
- errorMessage ===
257
- 'OptimismPortal: withdrawal has not been proven by proof submitter address yet' ||
258
- errorMessage ===
259
- 'OptimismPortal: dispute game created before respected game type was updated'
260
- )
252
+ // All potential error causes listed here, can either be the error string or the error name
253
+ // if custom error types are returned.
254
+ const errorCauses = {
255
+ 'ready-to-prove': [
256
+ 'OptimismPortal: invalid game type',
257
+ 'OptimismPortal: withdrawal has not been proven yet',
258
+ 'OptimismPortal: withdrawal has not been proven by proof submitter address yet',
259
+ 'OptimismPortal: dispute game created before respected game type was updated',
260
+ 'InvalidGameType',
261
+ 'LegacyGame',
262
+ ],
263
+ 'waiting-to-finalize': [
264
+ 'OptimismPortal: proven withdrawal has not matured yet',
265
+ 'OptimismPortal: output proposal has not been finalized yet',
266
+ 'OptimismPortal: output proposal in air-gap',
267
+ ],
268
+ }
269
+
270
+ // Pick out the error message and/or error name
271
+ // Return the status based on the error
272
+ const errors = [
273
+ error.cause.data?.errorName,
274
+ error.cause.data?.args?.[0] as string,
275
+ ]
276
+ if (errorCauses['ready-to-prove'].some((cause) => errors.includes(cause)))
261
277
  return 'ready-to-prove'
262
278
  if (
263
- errorMessage ===
264
- 'OptimismPortal: proven withdrawal has not matured yet' ||
265
- errorMessage ===
266
- 'OptimismPortal: output proposal has not been finalized yet' ||
267
- errorMessage === 'OptimismPortal: output proposal in air-gap'
279
+ errorCauses['waiting-to-finalize'].some((cause) =>
280
+ errors.includes(cause),
281
+ )
268
282
  )
269
283
  return 'waiting-to-finalize'
270
-
271
- if (error.cause.data?.errorName === 'InvalidGameType')
272
- return 'ready-to-prove'
273
284
  }
274
285
  throw checkWithdrawalResult.reason
275
286
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "2.23.2",
4
+ "version": "2.23.3",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -0,0 +1,248 @@
1
+ import type { Address } from 'abitype'
2
+ import type { Account } from '../../accounts/types.js'
3
+ import { readContract } from '../../actions/public/readContract.js'
4
+ import {
5
+ type SendTransactionErrorType,
6
+ type SendTransactionParameters,
7
+ type SendTransactionRequest,
8
+ type SendTransactionReturnType,
9
+ sendTransaction,
10
+ } from '../../actions/wallet/sendTransaction.js'
11
+ import type { Client } from '../../clients/createClient.js'
12
+ import type { Transport } from '../../clients/transports/createTransport.js'
13
+ import { AccountNotFoundError } from '../../errors/account.js'
14
+ import {
15
+ ChainNotFoundError,
16
+ type ChainNotFoundErrorType,
17
+ } from '../../errors/chain.js'
18
+ import type { Chain } from '../../types/chain.js'
19
+ import type { Hex } from '../../types/misc.js'
20
+ import {
21
+ decodeAbiParameters,
22
+ encodeFunctionData,
23
+ isAddressEqual,
24
+ parseAccount,
25
+ slice,
26
+ } from '../../utils/index.js'
27
+ import { l1SharedBridgeAbi, l2SharedBridgeAbi } from '../constants/abis.js'
28
+ import { l2BaseTokenAddress } from '../constants/address.js'
29
+ import {
30
+ WithdrawalLogNotFoundError,
31
+ type WithdrawalLogNotFoundErrorType,
32
+ } from '../errors/bridge.js'
33
+ import type { ChainEIP712 } from '../types/chain.js'
34
+ import { getWithdrawalL2ToL1Log } from '../utils/bridge/getWithdrawalL2ToL1Log.js'
35
+ import { getWithdrawalLog } from '../utils/bridge/getWithdrawalLog.js'
36
+ import { getDefaultBridgeAddresses } from './getDefaultBridgeAddresses.js'
37
+ import { getLogProof } from './getLogProof.js'
38
+
39
+ export type FinalizeWithdrawalParameters<
40
+ chain extends Chain | undefined = Chain | undefined,
41
+ account extends Account | undefined = Account | undefined,
42
+ chainOverride extends Chain | undefined = Chain | undefined,
43
+ chainL2 extends ChainEIP712 | undefined = ChainEIP712 | undefined,
44
+ accountL2 extends Account | undefined = Account | undefined,
45
+ request extends SendTransactionRequest<
46
+ chain,
47
+ chainOverride
48
+ > = SendTransactionRequest<chain, chainOverride>,
49
+ > = Omit<
50
+ SendTransactionParameters<chain, account, chainOverride, request>,
51
+ 'value' | 'data' | 'to'
52
+ > & {
53
+ /** L2 client */
54
+ client: Client<Transport, chainL2, accountL2>
55
+ /** Hash of the L2 transaction where the withdrawal was initiated. */
56
+ hash: Hex
57
+ /** In case there were multiple withdrawals in one transaction, you may pass an index of the
58
+ withdrawal you want to finalize. */
59
+ index?: number | undefined
60
+ }
61
+
62
+ export type FinalizeWithdrawalReturnType = SendTransactionReturnType
63
+
64
+ export type FinalizeWithdrawalErrorType =
65
+ | SendTransactionErrorType
66
+ | WithdrawalLogNotFoundErrorType
67
+ | ChainNotFoundErrorType
68
+
69
+ /**
70
+ * Proves the inclusion of the `L2->L1` withdrawal message.
71
+ *
72
+ * @param client - Client to use
73
+ * @param parameters - {@link FinalizeWithdrawalParameters}
74
+ * @returns hash - The [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. {@link FinalizeWithdrawalReturnType}
75
+ *
76
+ * @example
77
+ * import { createPublicClient, http } from 'viem'
78
+ * import { privateKeyToAccount } from 'viem/accounts'
79
+ * import { mainnet, zksync } from 'viem/chains'
80
+ * import { finalizeWithdrawal, publicActionsL2 } from 'viem/zksync'
81
+ *
82
+ * const client = createPublicClient({
83
+ * chain: mainnet,
84
+ * transport: http(),
85
+ * })
86
+ *
87
+ * const clientL2 = createPublicClient({
88
+ * chain: zksync,
89
+ * transport: http(),
90
+ * }).extend(publicActionsL2())
91
+ *
92
+ * const hash = await finalizeWithdrawal(client, {
93
+ * account: privateKeyToAccount('0x…'),
94
+ * client: clientL2,
95
+ * hash: '0x...',
96
+ * })
97
+ *
98
+ * @example Account Hoisting
99
+ * import { createPublicClient, createWalletClient, http } from 'viem'
100
+ * import { privateKeyToAccount } from 'viem/accounts'
101
+ * import { mainnet, zksync } from 'viem/chains'
102
+ * import { finalizeWithdrawal, publicActionsL2 } from 'viem/zksync'
103
+ *
104
+ * const client = createWalletClient({
105
+ * account: privateKeyToAccount('0x…'),
106
+ * chain: mainnet,
107
+ * transport: http(),
108
+ * })
109
+ *
110
+ * const clientL2 = createPublicClient({
111
+ * chain: zksync,
112
+ * transport: http(),
113
+ * }).extend(publicActionsL2())
114
+ *
115
+ * const hash = await finalizeWithdrawal(client, {
116
+ * client: clientL2,
117
+ * hash: '0x…',
118
+ * })
119
+ */
120
+ export async function finalizeWithdrawal<
121
+ chain extends Chain | undefined,
122
+ account extends Account | undefined,
123
+ accountL2 extends Account | undefined,
124
+ const request extends SendTransactionRequest<chain, chainOverride>,
125
+ chainOverride extends Chain | undefined,
126
+ chainL2 extends ChainEIP712 | undefined,
127
+ >(
128
+ client: Client<Transport, chain, account>,
129
+ parameters: FinalizeWithdrawalParameters<
130
+ chain,
131
+ account,
132
+ chainOverride,
133
+ chainL2,
134
+ accountL2,
135
+ request
136
+ >,
137
+ ): Promise<FinalizeWithdrawalReturnType> {
138
+ const {
139
+ account: account_ = client.account,
140
+ client: l2Client,
141
+ hash,
142
+ index = 0,
143
+ ...rest
144
+ } = parameters
145
+ const account = account_ ? parseAccount(account_) : client.account
146
+ if (!account)
147
+ throw new AccountNotFoundError({
148
+ docsPath: '/docs/actions/wallet/sendTransaction',
149
+ })
150
+ if (!l2Client.chain) throw new ChainNotFoundError()
151
+
152
+ const {
153
+ l1BatchNumber,
154
+ l2MessageIndex,
155
+ l2TxNumberInBlock,
156
+ message,
157
+ sender,
158
+ proof,
159
+ } = await getFinalizeWithdrawalParams(l2Client, { hash, index })
160
+
161
+ let l1Bridge: Address
162
+
163
+ if (isAddressEqual(sender, l2BaseTokenAddress))
164
+ l1Bridge = (await getDefaultBridgeAddresses(l2Client)).sharedL1
165
+ else if (!(await isLegacyBridge(l2Client, { address: sender })))
166
+ l1Bridge = await readContract(l2Client, {
167
+ address: sender,
168
+ abi: l2SharedBridgeAbi,
169
+ functionName: 'l1SharedBridge',
170
+ args: [],
171
+ })
172
+ else
173
+ l1Bridge = await readContract(l2Client, {
174
+ address: sender,
175
+ abi: l2SharedBridgeAbi,
176
+ functionName: 'l1Bridge',
177
+ args: [],
178
+ })
179
+
180
+ const data = encodeFunctionData({
181
+ abi: l1SharedBridgeAbi,
182
+ functionName: 'finalizeWithdrawal',
183
+ args: [
184
+ BigInt(l2Client.chain.id),
185
+ l1BatchNumber!,
186
+ BigInt(l2MessageIndex),
187
+ Number(l2TxNumberInBlock),
188
+ message,
189
+ proof,
190
+ ],
191
+ })
192
+
193
+ return await sendTransaction(client, {
194
+ account,
195
+ to: l1Bridge,
196
+ data,
197
+ value: 0n,
198
+ ...rest,
199
+ } as SendTransactionParameters)
200
+ }
201
+
202
+ async function getFinalizeWithdrawalParams<
203
+ chain extends Chain | undefined,
204
+ account extends Account | undefined,
205
+ >(
206
+ client: Client<Transport, chain, account>,
207
+ parameters: { hash: Hex; index: number },
208
+ ) {
209
+ const { hash } = parameters
210
+ const { log, l1BatchTxId } = await getWithdrawalLog(client, parameters)
211
+ const { l2ToL1LogIndex } = await getWithdrawalL2ToL1Log(client, parameters)
212
+ const sender = slice(log.topics[1]!, 12) as Address
213
+ const proof = await getLogProof(client, {
214
+ txHash: hash,
215
+ index: l2ToL1LogIndex!,
216
+ })
217
+ if (!proof) {
218
+ throw new WithdrawalLogNotFoundError({ hash })
219
+ }
220
+
221
+ const [message] = decodeAbiParameters([{ type: 'bytes' }], log.data)
222
+
223
+ return {
224
+ l1BatchNumber: log.l1BatchNumber,
225
+ l2MessageIndex: proof.id,
226
+ l2TxNumberInBlock: l1BatchTxId,
227
+ message,
228
+ sender,
229
+ proof: proof.proof,
230
+ }
231
+ }
232
+
233
+ async function isLegacyBridge<
234
+ chain extends Chain | undefined,
235
+ account extends Account | undefined,
236
+ >(client: Client<Transport, chain, account>, parameters: { address: Address }) {
237
+ try {
238
+ await readContract(client, {
239
+ address: parameters.address,
240
+ abi: l2SharedBridgeAbi,
241
+ functionName: 'l1SharedBridge',
242
+ args: [],
243
+ })
244
+ return false
245
+ } catch (_e) {
246
+ return true
247
+ }
248
+ }