viem 2.23.1 → 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 (204) hide show
  1. package/CHANGELOG.md +38 -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/pumpfiTestnet.js +26 -0
  27. package/_cjs/chains/definitions/pumpfiTestnet.js.map +1 -0
  28. package/_cjs/chains/definitions/story.js +7 -0
  29. package/_cjs/chains/definitions/story.js.map +1 -1
  30. package/_cjs/chains/definitions/storyAeneid.js +31 -0
  31. package/_cjs/chains/definitions/storyAeneid.js.map +1 -0
  32. package/_cjs/chains/definitions/unichain.js +21 -1
  33. package/_cjs/chains/definitions/unichain.js.map +1 -1
  34. package/_cjs/chains/definitions/worldchain.js +1 -1
  35. package/_cjs/chains/index.js +25 -7
  36. package/_cjs/chains/index.js.map +1 -1
  37. package/_cjs/errors/version.js +1 -1
  38. package/_cjs/op-stack/abis.js +7 -96
  39. package/_cjs/op-stack/abis.js.map +1 -1
  40. package/_cjs/op-stack/actions/getWithdrawalStatus.js +21 -14
  41. package/_cjs/op-stack/actions/getWithdrawalStatus.js.map +1 -1
  42. package/_cjs/op-stack/chains.js +3 -1
  43. package/_cjs/op-stack/chains.js.map +1 -1
  44. package/_cjs/zksync/actions/finalizeWithdrawal.js +99 -0
  45. package/_cjs/zksync/actions/finalizeWithdrawal.js.map +1 -0
  46. package/_cjs/zksync/constants/abis.js +724 -1
  47. package/_cjs/zksync/constants/abis.js.map +1 -1
  48. package/_cjs/zksync/constants/address.js +2 -1
  49. package/_cjs/zksync/constants/address.js.map +1 -1
  50. package/_cjs/zksync/decorators/walletL1.js +2 -0
  51. package/_cjs/zksync/decorators/walletL1.js.map +1 -1
  52. package/_cjs/zksync/errors/bridge.js +11 -1
  53. package/_cjs/zksync/errors/bridge.js.map +1 -1
  54. package/_cjs/zksync/index.js +4 -2
  55. package/_cjs/zksync/index.js.map +1 -1
  56. package/_cjs/zksync/utils/bridge/getWithdrawalL2ToL1Log.js +19 -0
  57. package/_cjs/zksync/utils/bridge/getWithdrawalL2ToL1Log.js.map +1 -0
  58. package/_cjs/zksync/utils/bridge/getWithdrawalLog.js +19 -0
  59. package/_cjs/zksync/utils/bridge/getWithdrawalLog.js.map +1 -0
  60. package/_esm/chains/definitions/b3.js +6 -0
  61. package/_esm/chains/definitions/b3.js.map +1 -1
  62. package/_esm/chains/definitions/b3Sepolia.js +6 -0
  63. package/_esm/chains/definitions/b3Sepolia.js.map +1 -1
  64. package/_esm/chains/definitions/berachainTestnet.js +6 -0
  65. package/_esm/chains/definitions/berachainTestnet.js.map +1 -1
  66. package/_esm/chains/definitions/donatuz.js +1 -1
  67. package/_esm/chains/definitions/donatuz.js.map +1 -1
  68. package/_esm/chains/definitions/hashkeyChainTestnet.js +1 -0
  69. package/_esm/chains/definitions/hashkeyChainTestnet.js.map +1 -1
  70. package/_esm/chains/definitions/haustTestnet.js +23 -0
  71. package/_esm/chains/definitions/haustTestnet.js.map +1 -0
  72. package/_esm/chains/definitions/lumoz.js +23 -0
  73. package/_esm/chains/definitions/lumoz.js.map +1 -0
  74. package/_esm/chains/definitions/lumozTestnet.js +17 -0
  75. package/_esm/chains/definitions/lumozTestnet.js.map +1 -0
  76. package/_esm/chains/definitions/newton.js +23 -0
  77. package/_esm/chains/definitions/newton.js.map +1 -0
  78. package/_esm/chains/definitions/peaq.js +38 -0
  79. package/_esm/chains/definitions/peaq.js.map +1 -0
  80. package/_esm/chains/definitions/polynomial.js +28 -0
  81. package/_esm/chains/definitions/polynomial.js.map +1 -0
  82. package/_esm/chains/definitions/polynomialSepolia.js +28 -0
  83. package/_esm/chains/definitions/polynomialSepolia.js.map +1 -0
  84. package/_esm/chains/definitions/pumpfiTestnet.js +23 -0
  85. package/_esm/chains/definitions/pumpfiTestnet.js.map +1 -0
  86. package/_esm/chains/definitions/story.js +7 -0
  87. package/_esm/chains/definitions/story.js.map +1 -1
  88. package/_esm/chains/definitions/storyAeneid.js +28 -0
  89. package/_esm/chains/definitions/storyAeneid.js.map +1 -0
  90. package/_esm/chains/definitions/unichain.js +21 -1
  91. package/_esm/chains/definitions/unichain.js.map +1 -1
  92. package/_esm/chains/definitions/worldchain.js +1 -1
  93. package/_esm/chains/index.js +11 -0
  94. package/_esm/chains/index.js.map +1 -1
  95. package/_esm/errors/version.js +1 -1
  96. package/_esm/op-stack/abis.js +7 -96
  97. package/_esm/op-stack/abis.js.map +1 -1
  98. package/_esm/op-stack/actions/getWithdrawalStatus.js +25 -14
  99. package/_esm/op-stack/actions/getWithdrawalStatus.js.map +1 -1
  100. package/_esm/op-stack/chains.js +1 -0
  101. package/_esm/op-stack/chains.js.map +1 -1
  102. package/_esm/zksync/actions/finalizeWithdrawal.js +147 -0
  103. package/_esm/zksync/actions/finalizeWithdrawal.js.map +1 -0
  104. package/_esm/zksync/constants/abis.js +723 -0
  105. package/_esm/zksync/constants/abis.js.map +1 -1
  106. package/_esm/zksync/constants/address.js +1 -0
  107. package/_esm/zksync/constants/address.js.map +1 -1
  108. package/_esm/zksync/decorators/walletL1.js +2 -0
  109. package/_esm/zksync/decorators/walletL1.js.map +1 -1
  110. package/_esm/zksync/errors/bridge.js +9 -0
  111. package/_esm/zksync/errors/bridge.js.map +1 -1
  112. package/_esm/zksync/index.js +1 -0
  113. package/_esm/zksync/index.js.map +1 -1
  114. package/_esm/zksync/utils/bridge/getWithdrawalL2ToL1Log.js +17 -0
  115. package/_esm/zksync/utils/bridge/getWithdrawalL2ToL1Log.js.map +1 -0
  116. package/_esm/zksync/utils/bridge/getWithdrawalLog.js +17 -0
  117. package/_esm/zksync/utils/bridge/getWithdrawalLog.js.map +1 -0
  118. package/_types/chains/definitions/b3.d.ts +6 -10
  119. package/_types/chains/definitions/b3.d.ts.map +1 -1
  120. package/_types/chains/definitions/b3Sepolia.d.ts +6 -10
  121. package/_types/chains/definitions/b3Sepolia.d.ts.map +1 -1
  122. package/_types/chains/definitions/berachainTestnet.d.ts +6 -10
  123. package/_types/chains/definitions/berachainTestnet.d.ts.map +1 -1
  124. package/_types/chains/definitions/donatuz.d.ts +1 -1
  125. package/_types/chains/definitions/hashkeyChainTestnet.d.ts +1 -1
  126. package/_types/chains/definitions/hashkeyChainTestnet.d.ts.map +1 -1
  127. package/_types/chains/definitions/haustTestnet.d.ts +37 -0
  128. package/_types/chains/definitions/haustTestnet.d.ts.map +1 -0
  129. package/_types/chains/definitions/lumoz.d.ts +37 -0
  130. package/_types/chains/definitions/lumoz.d.ts.map +1 -0
  131. package/_types/chains/definitions/lumozTestnet.d.ts +43 -0
  132. package/_types/chains/definitions/lumozTestnet.d.ts.map +1 -0
  133. package/_types/chains/definitions/newton.d.ts +37 -0
  134. package/_types/chains/definitions/newton.d.ts.map +1 -0
  135. package/_types/chains/definitions/peaq.d.ts +34 -0
  136. package/_types/chains/definitions/peaq.d.ts.map +1 -0
  137. package/_types/chains/definitions/polynomial.d.ts +32 -0
  138. package/_types/chains/definitions/polynomial.d.ts.map +1 -0
  139. package/_types/chains/definitions/polynomialSepolia.d.ts +32 -0
  140. package/_types/chains/definitions/polynomialSepolia.d.ts.map +1 -0
  141. package/_types/chains/definitions/pumpfiTestnet.d.ts +37 -0
  142. package/_types/chains/definitions/pumpfiTestnet.d.ts.map +1 -0
  143. package/_types/chains/definitions/story.d.ts +6 -11
  144. package/_types/chains/definitions/story.d.ts.map +1 -1
  145. package/_types/chains/definitions/storyAeneid.d.ts +34 -0
  146. package/_types/chains/definitions/storyAeneid.d.ts.map +1 -0
  147. package/_types/chains/definitions/unichain.d.ts +269 -4
  148. package/_types/chains/definitions/unichain.d.ts.map +1 -1
  149. package/_types/chains/definitions/worldchain.d.ts +1 -1
  150. package/_types/chains/index.d.ts +11 -0
  151. package/_types/chains/index.d.ts.map +1 -1
  152. package/_types/errors/version.d.ts +1 -1
  153. package/_types/op-stack/abis.d.ts +7 -77
  154. package/_types/op-stack/abis.d.ts.map +1 -1
  155. package/_types/op-stack/actions/getWithdrawalStatus.d.ts.map +1 -1
  156. package/_types/op-stack/chains.d.ts +1 -0
  157. package/_types/op-stack/chains.d.ts.map +1 -1
  158. package/_types/zksync/actions/finalizeWithdrawal.d.ts +73 -0
  159. package/_types/zksync/actions/finalizeWithdrawal.d.ts.map +1 -0
  160. package/_types/zksync/constants/abis.d.ts +567 -0
  161. package/_types/zksync/constants/abis.d.ts.map +1 -1
  162. package/_types/zksync/constants/address.d.ts +1 -0
  163. package/_types/zksync/constants/address.d.ts.map +1 -1
  164. package/_types/zksync/decorators/walletL1.d.ts +31 -0
  165. package/_types/zksync/decorators/walletL1.d.ts.map +1 -1
  166. package/_types/zksync/errors/bridge.d.ts +9 -0
  167. package/_types/zksync/errors/bridge.d.ts.map +1 -1
  168. package/_types/zksync/index.d.ts +1 -0
  169. package/_types/zksync/index.d.ts.map +1 -1
  170. package/_types/zksync/utils/bridge/getWithdrawalL2ToL1Log.d.ts +20 -0
  171. package/_types/zksync/utils/bridge/getWithdrawalL2ToL1Log.d.ts.map +1 -0
  172. package/_types/zksync/utils/bridge/getWithdrawalLog.d.ts +20 -0
  173. package/_types/zksync/utils/bridge/getWithdrawalLog.d.ts.map +1 -0
  174. package/chains/definitions/b3.ts +6 -0
  175. package/chains/definitions/b3Sepolia.ts +6 -0
  176. package/chains/definitions/berachainTestnet.ts +6 -0
  177. package/chains/definitions/donatuz.ts +1 -1
  178. package/chains/definitions/hashkeyChainTestnet.ts +1 -0
  179. package/chains/definitions/haustTestnet.ts +23 -0
  180. package/chains/definitions/lumoz.ts +23 -0
  181. package/chains/definitions/lumozTestnet.ts +17 -0
  182. package/chains/definitions/newton.ts +23 -0
  183. package/chains/definitions/peaq.ts +38 -0
  184. package/chains/definitions/polynomial.ts +28 -0
  185. package/chains/definitions/polynomialSepolia.ts +28 -0
  186. package/chains/definitions/pumpfiTestnet.ts +23 -0
  187. package/chains/definitions/story.ts +7 -0
  188. package/chains/definitions/storyAeneid.ts +28 -0
  189. package/chains/definitions/unichain.ts +22 -1
  190. package/chains/definitions/worldchain.ts +1 -1
  191. package/chains/index.ts +11 -0
  192. package/errors/version.ts +1 -1
  193. package/op-stack/abis.ts +7 -96
  194. package/op-stack/actions/getWithdrawalStatus.ts +28 -17
  195. package/op-stack/chains.ts +1 -0
  196. package/package.json +1 -1
  197. package/zksync/actions/finalizeWithdrawal.ts +248 -0
  198. package/zksync/constants/abis.ts +724 -0
  199. package/zksync/constants/address.ts +3 -0
  200. package/zksync/decorators/walletL1.ts +48 -0
  201. package/zksync/errors/bridge.ts +17 -0
  202. package/zksync/index.ts +6 -0
  203. package/zksync/utils/bridge/getWithdrawalL2ToL1Log.ts +47 -0
  204. package/zksync/utils/bridge/getWithdrawalLog.ts +47 -0
package/op-stack/abis.ts CHANGED
@@ -917,19 +917,6 @@ export const portal2Abi = [
917
917
  stateMutability: 'payable',
918
918
  type: 'receive',
919
919
  },
920
- {
921
- inputs: [],
922
- name: 'balance',
923
- outputs: [
924
- {
925
- internalType: 'uint256',
926
- name: '',
927
- type: 'uint256',
928
- },
929
- ],
930
- stateMutability: 'view',
931
- type: 'function',
932
- },
933
920
  {
934
921
  inputs: [
935
922
  {
@@ -961,44 +948,6 @@ export const portal2Abi = [
961
948
  stateMutability: 'view',
962
949
  type: 'function',
963
950
  },
964
- {
965
- inputs: [
966
- {
967
- internalType: 'address',
968
- name: '_to',
969
- type: 'address',
970
- },
971
- {
972
- internalType: 'uint256',
973
- name: '_mint',
974
- type: 'uint256',
975
- },
976
- {
977
- internalType: 'uint256',
978
- name: '_value',
979
- type: 'uint256',
980
- },
981
- {
982
- internalType: 'uint64',
983
- name: '_gasLimit',
984
- type: 'uint64',
985
- },
986
- {
987
- internalType: 'bool',
988
- name: '_isCreation',
989
- type: 'bool',
990
- },
991
- {
992
- internalType: 'bytes',
993
- name: '_data',
994
- type: 'bytes',
995
- },
996
- ],
997
- name: 'depositERC20Transaction',
998
- outputs: [],
999
- stateMutability: 'nonpayable',
1000
- type: 'function',
1001
- },
1002
951
  {
1003
952
  inputs: [
1004
953
  {
@@ -1056,7 +1005,7 @@ export const portal2Abi = [
1056
1005
  name: 'disputeGameFactory',
1057
1006
  outputs: [
1058
1007
  {
1059
- internalType: 'contract DisputeGameFactory',
1008
+ internalType: 'contract IDisputeGameFactory',
1060
1009
  name: '',
1061
1010
  type: 'address',
1062
1011
  },
@@ -1214,17 +1163,17 @@ export const portal2Abi = [
1214
1163
  {
1215
1164
  inputs: [
1216
1165
  {
1217
- internalType: 'contract DisputeGameFactory',
1166
+ internalType: 'contract IDisputeGameFactory',
1218
1167
  name: '_disputeGameFactory',
1219
1168
  type: 'address',
1220
1169
  },
1221
1170
  {
1222
- internalType: 'contract SystemConfig',
1171
+ internalType: 'contract ISystemConfig',
1223
1172
  name: '_systemConfig',
1224
1173
  type: 'address',
1225
1174
  },
1226
1175
  {
1227
- internalType: 'contract SuperchainConfig',
1176
+ internalType: 'contract ISuperchainConfig',
1228
1177
  name: '_superchainConfig',
1229
1178
  type: 'address',
1230
1179
  },
@@ -1500,34 +1449,6 @@ export const portal2Abi = [
1500
1449
  stateMutability: 'view',
1501
1450
  type: 'function',
1502
1451
  },
1503
- {
1504
- inputs: [
1505
- {
1506
- internalType: 'address',
1507
- name: '_token',
1508
- type: 'address',
1509
- },
1510
- {
1511
- internalType: 'uint8',
1512
- name: '_decimals',
1513
- type: 'uint8',
1514
- },
1515
- {
1516
- internalType: 'bytes32',
1517
- name: '_name',
1518
- type: 'bytes32',
1519
- },
1520
- {
1521
- internalType: 'bytes32',
1522
- name: '_symbol',
1523
- type: 'bytes32',
1524
- },
1525
- ],
1526
- name: 'setGasPayingToken',
1527
- outputs: [],
1528
- stateMutability: 'nonpayable',
1529
- type: 'function',
1530
- },
1531
1452
  {
1532
1453
  inputs: [
1533
1454
  {
@@ -1546,7 +1467,7 @@ export const portal2Abi = [
1546
1467
  name: 'superchainConfig',
1547
1468
  outputs: [
1548
1469
  {
1549
- internalType: 'contract SuperchainConfig',
1470
+ internalType: 'contract ISuperchainConfig',
1550
1471
  name: '',
1551
1472
  type: 'address',
1552
1473
  },
@@ -1559,7 +1480,7 @@ export const portal2Abi = [
1559
1480
  name: 'systemConfig',
1560
1481
  outputs: [
1561
1482
  {
1562
- internalType: 'contract SystemConfig',
1483
+ internalType: 'contract ISystemConfig',
1563
1484
  name: '',
1564
1485
  type: 'address',
1565
1486
  },
@@ -1791,7 +1712,7 @@ export const portal2Abi = [
1791
1712
  },
1792
1713
  {
1793
1714
  inputs: [],
1794
- name: 'NoValue',
1715
+ name: 'LegacyGame',
1795
1716
  type: 'error',
1796
1717
  },
1797
1718
  {
@@ -1799,11 +1720,6 @@ export const portal2Abi = [
1799
1720
  name: 'NonReentrant',
1800
1721
  type: 'error',
1801
1722
  },
1802
- {
1803
- inputs: [],
1804
- name: 'OnlyCustomGasToken',
1805
- type: 'error',
1806
- },
1807
1723
  {
1808
1724
  inputs: [],
1809
1725
  name: 'OutOfGas',
@@ -1819,11 +1735,6 @@ export const portal2Abi = [
1819
1735
  name: 'SmallGasLimit',
1820
1736
  type: 'error',
1821
1737
  },
1822
- {
1823
- inputs: [],
1824
- name: 'TransferFailed',
1825
- type: 'error',
1826
- },
1827
1738
  {
1828
1739
  inputs: [],
1829
1740
  name: 'Unauthorized',
@@ -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
  }
@@ -19,6 +19,7 @@ export { snax } from '../chains/definitions/snax.js'
19
19
  export { snaxTestnet } from '../chains/definitions/snaxTestnet.js'
20
20
  export { soneium } from '../chains/definitions/soneium.js'
21
21
  export { soneiumMinato } from '../chains/definitions/soneiumMinato.js'
22
+ export { unichain } from '../chains/definitions/unichain.js'
22
23
  export { unichainSepolia } from '../chains/definitions/unichainSepolia.js'
23
24
  export { worldchain } from '../chains/definitions/worldchain.js'
24
25
  export { worldchainSepolia } from '../chains/definitions/worldchainSepolia.js'
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.1",
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
+ }