@matterlabs/zksync-js 0.0.7 → 0.0.9

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 (105) hide show
  1. package/dist/adapters/ethers/client.cjs +1705 -259
  2. package/dist/adapters/ethers/client.cjs.map +1 -1
  3. package/dist/adapters/ethers/client.d.ts +11 -0
  4. package/dist/adapters/ethers/client.js +6 -6
  5. package/dist/adapters/ethers/index.cjs +5254 -2335
  6. package/dist/adapters/ethers/index.cjs.map +1 -1
  7. package/dist/adapters/ethers/index.d.ts +4 -0
  8. package/dist/adapters/ethers/index.js +9 -9
  9. package/dist/adapters/ethers/resources/contracts/types.d.ts +15 -0
  10. package/dist/adapters/ethers/resources/deposits/context.d.ts +3 -3
  11. package/dist/adapters/ethers/resources/deposits/services/gas.d.ts +2 -2
  12. package/dist/adapters/ethers/resources/deposits/services/verification.d.ts +1 -1
  13. package/dist/adapters/ethers/resources/interop/address.d.ts +18 -0
  14. package/dist/adapters/ethers/resources/interop/attributes/resource.d.ts +9 -0
  15. package/dist/adapters/ethers/resources/interop/context.d.ts +36 -0
  16. package/dist/adapters/ethers/resources/interop/index.d.ts +63 -0
  17. package/dist/adapters/ethers/resources/interop/resolvers.d.ts +9 -0
  18. package/dist/adapters/ethers/resources/interop/routes/direct.d.ts +2 -0
  19. package/dist/adapters/ethers/resources/interop/routes/indirect.d.ts +2 -0
  20. package/dist/adapters/ethers/resources/interop/routes/types.d.ts +13 -0
  21. package/dist/adapters/ethers/resources/interop/services/erc20.d.ts +15 -0
  22. package/dist/adapters/ethers/resources/interop/services/finalization/bundle.d.ts +15 -0
  23. package/dist/adapters/ethers/resources/interop/services/finalization/data-fetchers.d.ts +17 -0
  24. package/dist/adapters/ethers/resources/interop/services/finalization/decoders.d.ts +12 -0
  25. package/dist/adapters/ethers/resources/interop/services/finalization/index.d.ts +13 -0
  26. package/dist/adapters/ethers/resources/interop/services/finalization/polling.d.ts +7 -0
  27. package/dist/adapters/ethers/resources/interop/services/finalization/status.d.ts +5 -0
  28. package/dist/adapters/ethers/resources/interop/services/finalization/topics.d.ts +6 -0
  29. package/dist/adapters/ethers/resources/interop/services/starter-data.d.ts +6 -0
  30. package/dist/adapters/ethers/resources/interop/types.d.ts +16 -0
  31. package/dist/adapters/ethers/resources/withdrawals/context.d.ts +2 -2
  32. package/dist/adapters/ethers/sdk.cjs +3384 -931
  33. package/dist/adapters/ethers/sdk.cjs.map +1 -1
  34. package/dist/adapters/ethers/sdk.d.ts +10 -8
  35. package/dist/adapters/ethers/sdk.js +7 -7
  36. package/dist/adapters/viem/client.cjs +760 -64
  37. package/dist/adapters/viem/client.cjs.map +1 -1
  38. package/dist/adapters/viem/client.js +6 -4
  39. package/dist/adapters/viem/index.cjs +404 -276
  40. package/dist/adapters/viem/index.cjs.map +1 -1
  41. package/dist/adapters/viem/index.d.ts +1 -0
  42. package/dist/adapters/viem/index.js +9 -8
  43. package/dist/adapters/viem/resources/deposits/context.d.ts +3 -3
  44. package/dist/adapters/viem/resources/deposits/services/gas.d.ts +2 -2
  45. package/dist/adapters/viem/resources/deposits/services/verification.d.ts +1 -1
  46. package/dist/adapters/viem/resources/withdrawals/context.d.ts +2 -2
  47. package/dist/adapters/viem/sdk.cjs +84 -92
  48. package/dist/adapters/viem/sdk.cjs.map +1 -1
  49. package/dist/adapters/viem/sdk.js +6 -6
  50. package/dist/{chunk-KRIRXY74.js → chunk-5AG6B7UX.js} +38 -63
  51. package/dist/{chunk-NNFWIAVG.js → chunk-AIFHAPJC.js} +9 -3
  52. package/dist/{chunk-NCR42O6O.js → chunk-C3AGOEHR.js} +11 -1
  53. package/dist/{chunk-GIXLOHLK.js → chunk-FBKBF7YM.js} +1534 -12
  54. package/dist/{chunk-VRL6Y4YJ.js → chunk-IYEDEUXG.js} +1 -1
  55. package/dist/chunk-JNWHQJU3.js +209 -0
  56. package/dist/{chunk-7VP6742W.js → chunk-KLNFDFLA.js} +43 -32
  57. package/dist/{chunk-GNERKUWO.js → chunk-QDJOEVGJ.js} +2 -2
  58. package/dist/{chunk-EWLA4NUE.js → chunk-RRKVUW3G.js} +1377 -78
  59. package/dist/{chunk-KAMEGD6I.js → chunk-SRPKTXIF.js} +1 -1
  60. package/dist/{chunk-WY36Z6YB.js → chunk-UIXU35ZU.js} +57 -19
  61. package/dist/{chunk-P5PIWVEO.js → chunk-ZVHFVUDE.js} +14 -26
  62. package/dist/core/abi.d.ts +5 -0
  63. package/dist/core/constants.cjs +10 -0
  64. package/dist/core/constants.cjs.map +1 -1
  65. package/dist/core/constants.d.ts +10 -0
  66. package/dist/core/constants.js +1 -1
  67. package/dist/core/index.cjs +1676 -186
  68. package/dist/core/index.cjs.map +1 -1
  69. package/dist/core/index.d.ts +2 -1
  70. package/dist/core/index.js +5 -5
  71. package/dist/core/internal/abis/IERC7786Attributes.d.ts +42 -0
  72. package/dist/core/internal/abis/IInteropCenter.d.ts +211 -0
  73. package/dist/core/internal/abis/IInteropHandler.d.ts +166 -0
  74. package/dist/core/internal/abis/InteropCenter.d.ts +578 -0
  75. package/dist/core/internal/abis/InteropRootStorage.d.ts +20 -0
  76. package/dist/core/internal/abis/L2MessageVerification.d.ts +277 -0
  77. package/dist/core/resources/interop/attributes/bundle.d.ts +6 -0
  78. package/dist/core/resources/interop/attributes/call.d.ts +6 -0
  79. package/dist/core/resources/interop/attributes/index.d.ts +4 -0
  80. package/dist/core/resources/interop/attributes/resource.d.ts +12 -0
  81. package/dist/core/resources/interop/attributes/types.d.ts +4 -0
  82. package/dist/core/resources/interop/events.d.ts +7 -0
  83. package/dist/core/resources/interop/finalization.d.ts +60 -0
  84. package/dist/core/resources/interop/plan.d.ts +39 -0
  85. package/dist/core/resources/interop/route.d.ts +15 -0
  86. package/dist/core/rpc/types.d.ts +9 -0
  87. package/dist/core/types/errors.d.ts +56 -5
  88. package/dist/core/types/fees.d.ts +9 -0
  89. package/dist/core/types/flows/base.d.ts +1 -1
  90. package/dist/core/types/flows/interop.d.ts +207 -0
  91. package/dist/core/types/flows/withdrawals.d.ts +0 -8
  92. package/dist/core/types/primitives.d.ts +1 -0
  93. package/dist/core/types/transactions.d.ts +10 -0
  94. package/dist/core/utils/addr.d.ts +2 -2
  95. package/dist/core/utils/events.d.ts +12 -0
  96. package/dist/core/utils/hash.d.ts +5 -0
  97. package/dist/core/utils/index.d.ts +5 -0
  98. package/dist/core/utils/number.d.ts +2 -0
  99. package/dist/index.cjs +1686 -186
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.ts +2 -1
  102. package/dist/index.js +5 -5
  103. package/package.json +6 -2
  104. package/dist/chunk-NGXRO2ZX.js +0 -142
  105. package/dist/core/resources/withdrawals/events.d.ts +0 -9
@@ -3,9 +3,58 @@
3
3
  var viem = require('viem');
4
4
  var sha3 = require('@noble/hashes/sha3');
5
5
  var utils = require('@noble/hashes/utils');
6
+ var ethers = require('ethers');
6
7
 
7
8
  // src/adapters/viem/client.ts
8
9
 
10
+ // src/core/utils/hash.ts
11
+ var RegExpHex = /^0x[0-9a-fA-F]*$/;
12
+ var isHash = (x, length) => {
13
+ if (!x || typeof x !== "string") return false;
14
+ return (x.length === length) && RegExpHex.test(x);
15
+ };
16
+ var isHash66 = (x) => isHash(x, 66);
17
+
18
+ // src/core/utils/number.ts
19
+ var isNumber = (x) => typeof x === "number" && Number.isFinite(x);
20
+ var isBigint = (x) => typeof x === "bigint";
21
+ var k256hex = (s) => `0x${utils.bytesToHex(sha3.keccak_256(utils.utf8ToBytes(s)))}`.toLowerCase();
22
+ var FORMAL_ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
23
+ var ETH_ADDRESS = "0x0000000000000000000000000000000000000001";
24
+ var L2_ASSET_ROUTER_ADDRESS = "0x0000000000000000000000000000000000010003";
25
+ var L2_NATIVE_TOKEN_VAULT_ADDRESS = "0x0000000000000000000000000000000000010004";
26
+ var L1_MESSENGER_ADDRESS = "0x0000000000000000000000000000000000008008";
27
+ var L2_BASE_TOKEN_ADDRESS = "0x000000000000000000000000000000000000800A";
28
+ var TOPIC_L1_MESSAGE_SENT_NEW = k256hex("L1MessageSent(uint256,bytes32,bytes)");
29
+ var TOPIC_L1_MESSAGE_SENT_LEG = k256hex("L1MessageSent(address,bytes32,bytes)");
30
+ var TOPIC_CANONICAL_ASSIGNED = "0x779f441679936c5441b671969f37400b8c3ed0071cb47444431bf985754560df";
31
+ var TOPIC_CANONICAL_SUCCESS = "0xe4def01b981193a97a9e81230d7b9f31812ceaf23f864a828a82c687911cb2df";
32
+ var BUFFER = 20n;
33
+ var TX_OVERHEAD_GAS = 10000n;
34
+ var TX_MEMORY_OVERHEAD_GAS = 10n;
35
+ var DEFAULT_PUBDATA_BYTES = 155n;
36
+ var DEFAULT_ABI_BYTES = 400n;
37
+ var SAFE_L1_BRIDGE_GAS = 700000n;
38
+
39
+ // src/core/utils/addr.ts
40
+ function isAddressEq(a, b) {
41
+ return a.toLowerCase() === b.toLowerCase();
42
+ }
43
+ function isETH(token) {
44
+ return isAddressEq(token, FORMAL_ETH_ADDRESS) || isAddressEq(token, L2_BASE_TOKEN_ADDRESS) || isAddressEq(token, ETH_ADDRESS);
45
+ }
46
+ function normalizeAddrEq(a, b) {
47
+ if (!a || !b) return false;
48
+ const normalize = (s) => {
49
+ const hasPrefix = s.slice(0, 2).toLowerCase() === "0x";
50
+ const body = hasPrefix ? s.slice(2) : s;
51
+ return `0x${body.toLowerCase()}`;
52
+ };
53
+ return normalize(a) === normalize(b);
54
+ }
55
+ var hexEq = (a, b) => a.toLowerCase() === b.toLowerCase();
56
+ var normalizeL1Token = (token) => isAddressEq(token, FORMAL_ETH_ADDRESS) ? ETH_ADDRESS : token;
57
+
9
58
  // src/core/errors/formatter.ts
10
59
  function elideMiddle(s, max = 96) {
11
60
  if (s.length <= max) return s;
@@ -16,7 +65,7 @@ function shortJSON(v, max = 240) {
16
65
  try {
17
66
  const s = JSON.stringify(
18
67
  v,
19
- (_k, val) => typeof val === "bigint" ? `${val.toString()}n` : val
68
+ (_k, val) => isBigint(val) ? `${val.toString()}n` : val
20
69
  );
21
70
  return s.length > max ? elideMiddle(s, max) : s;
22
71
  } catch {
@@ -36,7 +85,7 @@ function formatContextLine(ctx) {
36
85
  if (txHash !== void 0)
37
86
  parts.push(`txHash=${typeof txHash === "string" ? txHash : shortJSON(txHash, 96)}`);
38
87
  if (nonce !== void 0) {
39
- const nonceStr = typeof nonce === "string" || typeof nonce === "number" || typeof nonce === "bigint" ? String(nonce) : shortJSON(nonce, 48);
88
+ const nonceStr = typeof nonce === "string" || isNumber(nonce) || isBigint(nonce) ? String(nonce) : shortJSON(nonce, 48);
40
89
  parts.push(`nonce=${nonceStr}`);
41
90
  }
42
91
  return parts.length ? ` ${kv("Context", parts.join(" \u2022 "))}` : void 0;
@@ -66,17 +115,17 @@ function formatCause(c) {
66
115
  const head = [];
67
116
  if (obj.name !== void 0) {
68
117
  const nameVal = obj.name;
69
- const nameStr = typeof nameVal === "string" || typeof nameVal === "number" || typeof nameVal === "bigint" || typeof nameVal === "boolean" ? String(nameVal) : shortJSON(nameVal, 120);
118
+ const nameStr = typeof nameVal === "string" || isNumber(nameVal) || isBigint(nameVal) || typeof nameVal === "boolean" ? String(nameVal) : shortJSON(nameVal, 120);
70
119
  head.push(`name=${nameStr}`);
71
120
  }
72
121
  if (obj.code !== void 0) {
73
122
  const codeVal = obj.code;
74
- const codeStr = typeof codeVal === "string" || typeof codeVal === "number" || typeof codeVal === "bigint" || typeof codeVal === "boolean" ? String(codeVal) : shortJSON(codeVal, 120);
123
+ const codeStr = typeof codeVal === "string" || isNumber(codeVal) || isBigint(codeVal) || typeof codeVal === "boolean" ? String(codeVal) : shortJSON(codeVal, 120);
75
124
  head.push(`code=${codeStr}`);
76
125
  }
77
126
  if (head.length) out.push(` ${kv("Cause", head.join(" "))}`);
78
127
  if (obj.message) {
79
- const messageStr = typeof obj.message === "string" || typeof obj.message === "number" || typeof obj.message === "bigint" || typeof obj.message === "boolean" ? String(obj.message) : shortJSON(obj.message, 600);
128
+ const messageStr = typeof obj.message === "string" || isNumber(obj.message) || isBigint(obj.message) || typeof obj.message === "boolean" ? String(obj.message) : shortJSON(obj.message, 600);
80
129
  out.push(` message=${elideMiddle(messageStr, 600)}`);
81
130
  }
82
131
  if (obj.data) {
@@ -151,12 +200,13 @@ if (kInspect) {
151
200
  enumerable: false
152
201
  });
153
202
  }
154
- function isZKsyncError(e) {
203
+ function isZKsyncError(e, opts) {
155
204
  if (!e || typeof e !== "object") return false;
156
205
  const maybe = e;
157
206
  if (!("envelope" in maybe)) return false;
158
207
  const envelope = maybe.envelope;
159
- return typeof envelope?.type === "string" && typeof envelope?.message === "string";
208
+ if (typeof envelope?.type !== "string" || typeof envelope?.message !== "string") return false;
209
+ return true;
160
210
  }
161
211
  function isReceiptNotFound(e) {
162
212
  const chain = [];
@@ -203,6 +253,8 @@ function isReceiptNotFound(e) {
203
253
  })();
204
254
  return MSG_RE.test(raw);
205
255
  }
256
+ var OP_CLIENT = {
257
+ ensureAddresses: "client.ensureAddresses"};
206
258
  var OP_DEPOSITS = {
207
259
  // high-level flow ops
208
260
  quote: "deposits.quote",
@@ -279,11 +331,9 @@ var OP_WITHDRAWALS = {
279
331
  rawReceipt: "withdrawals.finalize.fetchParams:rawReceipt",
280
332
  messengerIndex: "withdrawals.finalize.fetchParams:messengerIndex",
281
333
  proof: "withdrawals.finalize.fetchParams:proof",
282
- network: "withdrawals.finalize.fetchParams:network",
283
- ensureAddresses: "withdrawals.finalize.fetchParams:ensureAddresses"
334
+ network: "withdrawals.finalize.fetchParams:network"
284
335
  },
285
336
  readiness: {
286
- ensureAddresses: "withdrawals.finalize.readiness:ensureAddresses",
287
337
  isFinalized: "withdrawals.finalize.readiness:isWithdrawalFinalized",
288
338
  simulate: "withdrawals.finalize.readiness:simulate"
289
339
  },
@@ -299,20 +349,20 @@ function createError(type, input) {
299
349
  return new ZKsyncError({ ...input, type });
300
350
  }
301
351
  function shapeCause(err) {
302
- const isRecord = (x) => x !== null && typeof x === "object";
352
+ const isRecord2 = (x) => x !== null && typeof x === "object";
303
353
  let data = void 0;
304
- if (isRecord(err)) {
354
+ if (isRecord2(err)) {
305
355
  const r2 = err;
306
356
  const d = r2.data;
307
- if (isRecord(d) && "data" in d) {
357
+ if (isRecord2(d) && "data" in d) {
308
358
  data = d.data;
309
- } else if ("error" in r2 && isRecord(r2.error) && "data" in r2.error) {
359
+ } else if ("error" in r2 && isRecord2(r2.error) && "data" in r2.error) {
310
360
  data = r2.error.data;
311
361
  } else if ("data" in r2) {
312
362
  data = r2.data;
313
363
  }
314
364
  }
315
- const r = isRecord(err) ? err : void 0;
365
+ const r = isRecord2(err) ? err : void 0;
316
366
  const name = r && typeof r.name === "string" ? r.name : void 0;
317
367
  const message = r && typeof r.message === "string" ? r.message : r && typeof r.shortMessage === "string" ? r.shortMessage : void 0;
318
368
  const code = r && "code" in r ? r.code : void 0;
@@ -366,7 +416,7 @@ function normalizeProof(p) {
366
416
  context: { keys: Object.keys(raw ?? {}) }
367
417
  });
368
418
  }
369
- const toBig = (x) => typeof x === "bigint" ? x : typeof x === "number" ? BigInt(x) : typeof x === "string" ? BigInt(x) : (() => {
419
+ const toBig = (x) => isBigint(x) ? x : isNumber(x) ? BigInt(x) : typeof x === "string" ? BigInt(x) : (() => {
370
420
  throw createError("RPC", {
371
421
  resource: "zksrpc",
372
422
  operation: "zksrpc.normalizeProof",
@@ -377,7 +427,8 @@ function normalizeProof(p) {
377
427
  return {
378
428
  id: toBig(idRaw),
379
429
  batchNumber: toBig(bnRaw),
380
- proof: toHexArray(raw?.proof)
430
+ proof: toHexArray(raw?.proof),
431
+ root: raw.root
381
432
  };
382
433
  } catch (e) {
383
434
  if (isZKsyncError(e)) throw e;
@@ -402,8 +453,8 @@ function ensureHex(value, field, context) {
402
453
  function ensureNumber(value, field, opts) {
403
454
  const operation = opts?.operation ?? "zksrpc.normalizeGenesis";
404
455
  const messagePrefix = opts?.messagePrefix ?? "Malformed genesis response";
405
- if (typeof value === "number" && Number.isFinite(value)) return value;
406
- if (typeof value === "bigint") return Number(value);
456
+ if (isNumber(value)) return value;
457
+ if (isBigint(value)) return Number(value);
407
458
  if (typeof value === "string" && value.trim() !== "") {
408
459
  const parsed = Number(value);
409
460
  if (Number.isFinite(parsed)) return parsed;
@@ -418,8 +469,8 @@ function ensureNumber(value, field, opts) {
418
469
  function ensureBigInt(value, field, opts) {
419
470
  const operation = opts?.operation ?? "zksrpc.normalizeBlockMetadata";
420
471
  const messagePrefix = opts?.messagePrefix ?? "Malformed block metadata response";
421
- if (typeof value === "bigint") return value;
422
- if (typeof value === "number" && Number.isFinite(value)) {
472
+ if (isBigint(value)) return value;
473
+ if (isNumber(value)) {
423
474
  if (!Number.isInteger(value)) {
424
475
  throw createError("RPC", {
425
476
  resource: "zksrpc",
@@ -443,6 +494,9 @@ function ensureBigInt(value, field, opts) {
443
494
  context: { field, valueType: typeof value }
444
495
  });
445
496
  }
497
+ function isRecord(x) {
498
+ return !!x && typeof x === "object" && !Array.isArray(x);
499
+ }
446
500
  function normalizeContractTuple(tuple, index) {
447
501
  if (!Array.isArray(tuple) || tuple.length < 2) {
448
502
  throw createError("RPC", {
@@ -458,7 +512,7 @@ function normalizeContractTuple(tuple, index) {
458
512
  bytecode: ensureHex(bytecodeRaw, "initial_contracts.bytecode", { index })
459
513
  };
460
514
  }
461
- function normalizeStorageTuple(tuple, index) {
515
+ function normalizeRawStorageTuple(tuple, index) {
462
516
  if (!Array.isArray(tuple) || tuple.length < 2) {
463
517
  throw createError("RPC", {
464
518
  resource: "zksrpc",
@@ -469,10 +523,53 @@ function normalizeStorageTuple(tuple, index) {
469
523
  }
470
524
  const [keyRaw, valueRaw] = tuple;
471
525
  return {
526
+ format: "raw",
472
527
  key: ensureHex(keyRaw, "additional_storage.key", { index }),
473
528
  value: ensureHex(valueRaw, "additional_storage.value", { index })
474
529
  };
475
530
  }
531
+ function normalizeAdditionalStorage(value, record) {
532
+ const effective = value ?? record["additional_storage_raw"];
533
+ if (Array.isArray(effective)) {
534
+ return effective.map((entry, index) => {
535
+ const kv2 = normalizeRawStorageTuple(entry, index);
536
+ return { format: "raw", key: kv2.key, value: kv2.value };
537
+ });
538
+ }
539
+ if (isRecord(effective)) {
540
+ const out = [];
541
+ for (const [addrRaw, slotsRaw] of Object.entries(effective)) {
542
+ const address = ensureHex(addrRaw, "additional_storage.address", {});
543
+ if (!isRecord(slotsRaw)) {
544
+ throw createError("RPC", {
545
+ resource: "zksrpc",
546
+ operation: "zksrpc.normalizeGenesis",
547
+ message: "Malformed genesis response: additional_storage[address] must be an object map.",
548
+ context: { address, valueType: typeof slotsRaw }
549
+ });
550
+ }
551
+ for (const [slotRaw, valRaw] of Object.entries(slotsRaw)) {
552
+ out.push({
553
+ format: "pretty",
554
+ address,
555
+ key: ensureHex(slotRaw, "additional_storage.key", { address }),
556
+ value: ensureHex(valRaw, "additional_storage.value", { address, key: slotRaw })
557
+ });
558
+ }
559
+ }
560
+ return out;
561
+ }
562
+ throw createError("RPC", {
563
+ resource: "zksrpc",
564
+ operation: "zksrpc.normalizeGenesis",
565
+ message: "Malformed genesis response: additional_storage must be an array (raw) or an object map (pretty).",
566
+ context: {
567
+ valueType: typeof effective,
568
+ hasAdditionalStorage: "additional_storage" in record,
569
+ hasAdditionalStorageRaw: "additional_storage_raw" in record
570
+ }
571
+ });
572
+ }
476
573
  function normalizeGenesis(raw) {
477
574
  try {
478
575
  if (!raw || typeof raw !== "object") {
@@ -493,21 +590,12 @@ function normalizeGenesis(raw) {
493
590
  context: { valueType: typeof contractsRaw }
494
591
  });
495
592
  }
496
- const storageRaw = record["additional_storage"];
497
- if (!Array.isArray(storageRaw)) {
498
- throw createError("RPC", {
499
- resource: "zksrpc",
500
- operation: "zksrpc.normalizeGenesis",
501
- message: "Malformed genesis response: additional_storage must be an array.",
502
- context: { valueType: typeof storageRaw }
503
- });
504
- }
505
593
  const executionVersion = ensureNumber(record["execution_version"], "execution_version");
506
594
  const genesisRoot = ensureHex(record["genesis_root"], "genesis_root", {});
507
595
  const initialContracts = contractsRaw.map(
508
596
  (entry, index) => normalizeContractTuple(entry, index)
509
597
  );
510
- const additionalStorage = storageRaw.map((entry, index) => normalizeStorageTuple(entry, index));
598
+ const additionalStorage = normalizeAdditionalStorage(record["additional_storage"], record);
511
599
  return {
512
600
  initialContracts,
513
601
  additionalStorage,
@@ -694,23 +782,6 @@ function zksRpcFromViem(l2Client) {
694
782
  };
695
783
  return createZksRpc(makeTransportFromViem(compatible));
696
784
  }
697
- var k256hex = (s) => `0x${utils.bytesToHex(sha3.keccak_256(utils.utf8ToBytes(s)))}`.toLowerCase();
698
- var FORMAL_ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
699
- var ETH_ADDRESS = "0x0000000000000000000000000000000000000001";
700
- var L2_ASSET_ROUTER_ADDRESS = "0x0000000000000000000000000000000000010003";
701
- var L2_NATIVE_TOKEN_VAULT_ADDRESS = "0x0000000000000000000000000000000000010004";
702
- var L1_MESSENGER_ADDRESS = "0x0000000000000000000000000000000000008008";
703
- var L2_BASE_TOKEN_ADDRESS = "0x000000000000000000000000000000000000800A";
704
- var TOPIC_L1_MESSAGE_SENT_NEW = k256hex("L1MessageSent(uint256,bytes32,bytes)");
705
- var TOPIC_L1_MESSAGE_SENT_LEG = k256hex("L1MessageSent(address,bytes32,bytes)");
706
- var TOPIC_CANONICAL_ASSIGNED = "0x779f441679936c5441b671969f37400b8c3ed0071cb47444431bf985754560df";
707
- var TOPIC_CANONICAL_SUCCESS = "0xe4def01b981193a97a9e81230d7b9f31812ceaf23f864a828a82c687911cb2df";
708
- var BUFFER = 20n;
709
- var TX_OVERHEAD_GAS = 10000n;
710
- var TX_MEMORY_OVERHEAD_GAS = 10n;
711
- var DEFAULT_PUBDATA_BYTES = 155n;
712
- var DEFAULT_ABI_BYTES = 400n;
713
- var SAFE_L1_BRIDGE_GAS = 700000n;
714
785
 
715
786
  // src/core/internal/abis/IBridgehub.ts
716
787
  var IBridgehubABI = [
@@ -5200,7 +5271,166 @@ var MailboxABI = [
5200
5271
  ];
5201
5272
  var Mailbox_default = MailboxABI;
5202
5273
 
5274
+ // src/core/errors/error-ops.ts
5275
+ function resolveMessage(op, msg) {
5276
+ if (!msg) return `Error during ${op}.`;
5277
+ return typeof msg === "function" ? msg() : msg;
5278
+ }
5279
+ function createErrorOps(decodeRevert3) {
5280
+ function toZKsyncError3(type, base, err) {
5281
+ if (isZKsyncError(err)) return err;
5282
+ const revert = decodeRevert3 ? decodeRevert3(err) : void 0;
5283
+ return createError(type, { ...base, ...revert ? { revert } : {}, cause: shapeCause(err) });
5284
+ }
5285
+ function createErrorHandlers3(resource) {
5286
+ async function run(kind, operation, fn, opts) {
5287
+ try {
5288
+ return await fn();
5289
+ } catch (e) {
5290
+ if (isZKsyncError(e)) throw e;
5291
+ const message = resolveMessage(operation, opts?.message);
5292
+ throw toZKsyncError3(kind, { resource, operation, context: opts?.ctx ?? {}, message }, e);
5293
+ }
5294
+ }
5295
+ function wrap3(operation, fn, opts) {
5296
+ return run("INTERNAL", operation, fn, opts);
5297
+ }
5298
+ function wrapAs10(kind, operation, fn, opts) {
5299
+ return run(kind, operation, fn, opts);
5300
+ }
5301
+ async function toResult2(operation, fn, opts) {
5302
+ try {
5303
+ const value = await wrap3(operation, fn, opts);
5304
+ return { ok: true, value };
5305
+ } catch (e) {
5306
+ const shaped = isZKsyncError(e) ? e : toZKsyncError3(
5307
+ "INTERNAL",
5308
+ {
5309
+ resource,
5310
+ operation,
5311
+ context: opts?.ctx ?? {},
5312
+ message: resolveMessage(operation, opts?.message)
5313
+ },
5314
+ e
5315
+ );
5316
+ return { ok: false, error: shaped };
5317
+ }
5318
+ }
5319
+ return { wrap: wrap3, wrapAs: wrapAs10, toResult: toResult2 };
5320
+ }
5321
+ return { toZKsyncError: toZKsyncError3, createErrorHandlers: createErrorHandlers3 };
5322
+ }
5323
+
5324
+ // src/core/errors/withdrawal-revert-map.ts
5325
+ var REVERT_TO_READINESS = {
5326
+ // Already done
5327
+ WithdrawalAlreadyFinalized: { kind: "FINALIZED" },
5328
+ // Temporary — try later
5329
+ BatchNotExecuted: { kind: "NOT_READY", reason: "batch-not-executed" },
5330
+ LocalRootIsZero: { kind: "NOT_READY", reason: "root-missing" },
5331
+ // Permanent — won’t become ready for this tx
5332
+ WrongL2Sender: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5333
+ InvalidSelector: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5334
+ L2WithdrawalMessageWrongLength: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5335
+ WrongMsgLength: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5336
+ TokenNotLegacy: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5337
+ TokenIsLegacy: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5338
+ InvalidProof: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5339
+ InvalidChainId: { kind: "UNFINALIZABLE", reason: "invalid-chain" },
5340
+ NotSettlementLayer: { kind: "UNFINALIZABLE", reason: "settlement-layer" },
5341
+ // Likely environment mismatch — treat as permanent for this tx
5342
+ OnlyEraSupported: { kind: "UNFINALIZABLE", reason: "unsupported" },
5343
+ LocalRootMustBeZero: { kind: "UNFINALIZABLE", reason: "unsupported" }
5344
+ };
5345
+
5346
+ // src/adapters/ethers/errors/revert.ts
5347
+ var ERROR_IFACES = [];
5348
+ var IFACE_ERROR_STRING = new ethers.Interface(["error Error(string)"]);
5349
+ var IFACE_PANIC = new ethers.Interface(["error Panic(uint256)"]);
5350
+ (function bootstrapDefaultIfaces() {
5351
+ try {
5352
+ ERROR_IFACES.push({
5353
+ name: "IL1Nullifier",
5354
+ iface: new ethers.Interface(IL1Nullifier_default)
5355
+ });
5356
+ } catch {
5357
+ }
5358
+ try {
5359
+ ERROR_IFACES.push({ name: "IERC20", iface: new ethers.Interface(IERC20_default) });
5360
+ } catch {
5361
+ }
5362
+ try {
5363
+ ERROR_IFACES.push({
5364
+ name: "IL1NativeTokenVault",
5365
+ iface: new ethers.Interface(L1NativeTokenVault_default)
5366
+ });
5367
+ } catch {
5368
+ }
5369
+ try {
5370
+ ERROR_IFACES.push({
5371
+ name: "IL2NativeTokenVault",
5372
+ iface: new ethers.Interface(L2NativeTokenVault_default)
5373
+ });
5374
+ } catch {
5375
+ }
5376
+ try {
5377
+ ERROR_IFACES.push({ name: "Mailbox", iface: new ethers.Interface(Mailbox_default) });
5378
+ } catch {
5379
+ }
5380
+ })();
5381
+ function extractRevertData(e) {
5382
+ const maybe = (
5383
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
5384
+ e?.data?.data ?? e?.error?.data ?? e?.data ?? e?.error?.error?.data ?? e?.info?.error?.data
5385
+ );
5386
+ if (typeof maybe === "string" && maybe.startsWith("0x") && maybe.length >= 10) {
5387
+ return maybe;
5388
+ }
5389
+ return void 0;
5390
+ }
5391
+ function decodeRevert(e) {
5392
+ const data = extractRevertData(e);
5393
+ if (!data) return;
5394
+ const selector = `0x${data.slice(2, 10)}`;
5395
+ try {
5396
+ const parsed = IFACE_ERROR_STRING.parseError(data);
5397
+ if (parsed?.name === "Error") {
5398
+ const args = parsed.args ? Array.from(parsed.args) : void 0;
5399
+ return { selector, name: "Error", args };
5400
+ }
5401
+ } catch {
5402
+ }
5403
+ try {
5404
+ const parsed = IFACE_PANIC.parseError(data);
5405
+ if (parsed?.name === "Panic") {
5406
+ const args = parsed.args ? Array.from(parsed.args) : void 0;
5407
+ return { selector, name: "Panic", args };
5408
+ }
5409
+ } catch {
5410
+ }
5411
+ for (const { name, iface } of ERROR_IFACES) {
5412
+ try {
5413
+ const parsed = iface.parseError(data);
5414
+ if (parsed) {
5415
+ const args = parsed.args ? Array.from(parsed.args) : void 0;
5416
+ return {
5417
+ selector,
5418
+ name: parsed.name,
5419
+ args,
5420
+ contract: name
5421
+ };
5422
+ }
5423
+ } catch {
5424
+ }
5425
+ }
5426
+ return { selector };
5427
+ }
5428
+
5429
+ // src/adapters/ethers/errors/error-ops.ts
5430
+ var { createErrorHandlers } = createErrorOps(decodeRevert);
5431
+
5203
5432
  // src/adapters/viem/client.ts
5433
+ var { wrap } = createErrorHandlers("client");
5204
5434
  function createViemClient(args) {
5205
5435
  const { l1, l2, l1Wallet, l2Wallet } = args;
5206
5436
  if (!l1Wallet.account) {
@@ -5212,35 +5442,44 @@ function createViemClient(args) {
5212
5442
  let cCache;
5213
5443
  async function ensureAddresses() {
5214
5444
  if (addrCache) return addrCache;
5215
- const bridgehub = args.overrides?.bridgehub ?? await zks.getBridgehubAddress();
5216
- const l1AssetRouter = args.overrides?.l1AssetRouter ?? await l1.readContract({
5217
- address: bridgehub,
5218
- abi: IBridgehub_default,
5219
- functionName: "assetRouter"
5220
- });
5221
- const l1Nullifier = args.overrides?.l1Nullifier ?? await l1.readContract({
5222
- address: l1AssetRouter,
5223
- abi: IL1AssetRouter_default,
5224
- functionName: "L1_NULLIFIER"
5225
- });
5226
- const l1NativeTokenVault = args.overrides?.l1NativeTokenVault ?? await l1.readContract({
5227
- address: l1Nullifier,
5228
- abi: IL1Nullifier_default,
5229
- functionName: "l1NativeTokenVault"
5230
- });
5231
- const l2AssetRouter = args.overrides?.l2AssetRouter ?? L2_ASSET_ROUTER_ADDRESS;
5232
- const l2NativeTokenVault = args.overrides?.l2NativeTokenVault ?? L2_NATIVE_TOKEN_VAULT_ADDRESS;
5233
- const l2BaseTokenSystem = args.overrides?.l2BaseTokenSystem ?? L2_BASE_TOKEN_ADDRESS;
5234
- addrCache = {
5235
- bridgehub,
5236
- l1AssetRouter,
5237
- l1Nullifier,
5238
- l1NativeTokenVault,
5239
- l2AssetRouter,
5240
- l2NativeTokenVault,
5241
- l2BaseTokenSystem
5242
- };
5243
- return addrCache;
5445
+ return await wrap(
5446
+ OP_CLIENT.ensureAddresses,
5447
+ async () => {
5448
+ const bridgehub = args.overrides?.bridgehub ?? await zks.getBridgehubAddress();
5449
+ const l1AssetRouter = args.overrides?.l1AssetRouter ?? await l1.readContract({
5450
+ address: bridgehub,
5451
+ abi: IBridgehub_default,
5452
+ functionName: "assetRouter"
5453
+ });
5454
+ const l1Nullifier = args.overrides?.l1Nullifier ?? await l1.readContract({
5455
+ address: l1AssetRouter,
5456
+ abi: IL1AssetRouter_default,
5457
+ functionName: "L1_NULLIFIER"
5458
+ });
5459
+ const l1NativeTokenVault = args.overrides?.l1NativeTokenVault ?? await l1.readContract({
5460
+ address: l1Nullifier,
5461
+ abi: IL1Nullifier_default,
5462
+ functionName: "l1NativeTokenVault"
5463
+ });
5464
+ const l2AssetRouter = args.overrides?.l2AssetRouter ?? L2_ASSET_ROUTER_ADDRESS;
5465
+ const l2NativeTokenVault = args.overrides?.l2NativeTokenVault ?? L2_NATIVE_TOKEN_VAULT_ADDRESS;
5466
+ const l2BaseTokenSystem = args.overrides?.l2BaseTokenSystem ?? L2_BASE_TOKEN_ADDRESS;
5467
+ addrCache = {
5468
+ bridgehub,
5469
+ l1AssetRouter,
5470
+ l1Nullifier,
5471
+ l1NativeTokenVault,
5472
+ l2AssetRouter,
5473
+ l2NativeTokenVault,
5474
+ l2BaseTokenSystem
5475
+ };
5476
+ return addrCache;
5477
+ },
5478
+ {
5479
+ ctx: { where: "ensureAddresses" },
5480
+ message: "Failed to ensure contract addresses."
5481
+ }
5482
+ );
5244
5483
  }
5245
5484
  async function contracts() {
5246
5485
  if (cCache) return cCache;
@@ -5309,6 +5548,12 @@ function createViemClient(args) {
5309
5548
  };
5310
5549
  }
5311
5550
 
5551
+ // src/core/types/fees.ts
5552
+ function toGasOverrides(overrides) {
5553
+ const { nonce: _, ...gas } = overrides;
5554
+ return gas;
5555
+ }
5556
+
5312
5557
  // src/adapters/viem/resources/deposits/context.ts
5313
5558
  async function commonCtx(p, client, tokens, contracts) {
5314
5559
  const { bridgehub, l1AssetRouter } = await contracts.addresses();
@@ -5343,7 +5588,7 @@ async function commonCtx(p, client, tokens, contracts) {
5343
5588
  bridgehub,
5344
5589
  chainIdL2: BigInt(chainId),
5345
5590
  sender,
5346
- gasOverrides: p.l1TxOverrides,
5591
+ gasOverrides: p.l1TxOverrides ? toGasOverrides(p.l1TxOverrides) : void 0,
5347
5592
  l2GasLimit: p.l2GasLimit,
5348
5593
  gasPerPubdata,
5349
5594
  operatorTip,
@@ -5399,80 +5644,6 @@ function buildDirectRequestStruct(args) {
5399
5644
  refundRecipient: args.refundRecipient
5400
5645
  };
5401
5646
  }
5402
-
5403
- // src/core/errors/error-ops.ts
5404
- function resolveMessage(op, msg) {
5405
- if (!msg) return `Error during ${op}.`;
5406
- return typeof msg === "function" ? msg() : msg;
5407
- }
5408
- function createErrorOps(decodeRevert2) {
5409
- function toZKsyncError2(type, base, err) {
5410
- if (isZKsyncError(err)) return err;
5411
- const revert = decodeRevert2 ? decodeRevert2(err) : void 0;
5412
- return createError(type, { ...base, ...revert ? { revert } : {}, cause: shapeCause(err) });
5413
- }
5414
- function createErrorHandlers2(resource) {
5415
- async function run(kind, operation, fn, opts) {
5416
- try {
5417
- return await fn();
5418
- } catch (e) {
5419
- if (isZKsyncError(e)) throw e;
5420
- const message = resolveMessage(operation, opts?.message);
5421
- throw toZKsyncError2(kind, { resource, operation, context: opts?.ctx ?? {}, message }, e);
5422
- }
5423
- }
5424
- function wrap2(operation, fn, opts) {
5425
- return run("INTERNAL", operation, fn, opts);
5426
- }
5427
- function wrapAs10(kind, operation, fn, opts) {
5428
- return run(kind, operation, fn, opts);
5429
- }
5430
- async function toResult2(operation, fn, opts) {
5431
- try {
5432
- const value = await wrap2(operation, fn, opts);
5433
- return { ok: true, value };
5434
- } catch (e) {
5435
- const shaped = isZKsyncError(e) ? e : toZKsyncError2(
5436
- "INTERNAL",
5437
- {
5438
- resource,
5439
- operation,
5440
- context: opts?.ctx ?? {},
5441
- message: resolveMessage(operation, opts?.message)
5442
- },
5443
- e
5444
- );
5445
- return { ok: false, error: shaped };
5446
- }
5447
- }
5448
- return { wrap: wrap2, wrapAs: wrapAs10, toResult: toResult2 };
5449
- }
5450
- return { toZKsyncError: toZKsyncError2, createErrorHandlers: createErrorHandlers2 };
5451
- }
5452
-
5453
- // src/core/errors/withdrawal-revert-map.ts
5454
- var REVERT_TO_READINESS = {
5455
- // Already done
5456
- WithdrawalAlreadyFinalized: { kind: "FINALIZED" },
5457
- // Temporary — try later
5458
- BatchNotExecuted: { kind: "NOT_READY", reason: "batch-not-executed" },
5459
- LocalRootIsZero: { kind: "NOT_READY", reason: "root-missing" },
5460
- // Permanent — won’t become ready for this tx
5461
- WrongL2Sender: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5462
- InvalidSelector: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5463
- L2WithdrawalMessageWrongLength: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5464
- WrongMsgLength: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5465
- TokenNotLegacy: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5466
- TokenIsLegacy: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5467
- InvalidProof: { kind: "UNFINALIZABLE", reason: "message-invalid" },
5468
- InvalidChainId: { kind: "UNFINALIZABLE", reason: "invalid-chain" },
5469
- NotSettlementLayer: { kind: "UNFINALIZABLE", reason: "settlement-layer" },
5470
- // Likely environment mismatch — treat as permanent for this tx
5471
- OnlyEraSupported: { kind: "UNFINALIZABLE", reason: "unsupported" },
5472
- LocalRootMustBeZero: { kind: "UNFINALIZABLE", reason: "unsupported" }
5473
- };
5474
-
5475
- // src/adapters/viem/errors/revert.ts
5476
5647
  var ERROR_ABIS = [];
5477
5648
  var ABI_ERROR_STRING = [
5478
5649
  { type: "error", name: "Error", inputs: [{ name: "message", type: "string" }] }
@@ -5508,7 +5679,7 @@ function registerErrorAbi(name, abi) {
5508
5679
  if (i >= 0) ERROR_ABIS[i] = entry;
5509
5680
  else ERROR_ABIS.push(entry);
5510
5681
  }
5511
- function extractRevertData(e) {
5682
+ function extractRevertData2(e) {
5512
5683
  const candidates = [
5513
5684
  e?.data?.data,
5514
5685
  e?.error?.data,
@@ -5526,8 +5697,8 @@ function extractRevertData(e) {
5526
5697
  }
5527
5698
  return void 0;
5528
5699
  }
5529
- function decodeRevert(e) {
5530
- const data = extractRevertData(e);
5700
+ function decodeRevert2(e) {
5701
+ const data = extractRevertData2(e);
5531
5702
  if (!data) return;
5532
5703
  const selector = `0x${data.slice(2, 10)}`;
5533
5704
  try {
@@ -5561,7 +5732,7 @@ function decodeRevert(e) {
5561
5732
  return { selector };
5562
5733
  }
5563
5734
  function classifyReadinessFromRevert(e) {
5564
- const r = decodeRevert(e);
5735
+ const r = decodeRevert2(e);
5565
5736
  const name = r?.name;
5566
5737
  if (name && REVERT_TO_READINESS[name]) return REVERT_TO_READINESS[name];
5567
5738
  const msg = (() => {
@@ -5579,7 +5750,7 @@ function classifyReadinessFromRevert(e) {
5579
5750
  }
5580
5751
 
5581
5752
  // src/adapters/viem/errors/error-ops.ts
5582
- var { toZKsyncError, createErrorHandlers } = createErrorOps(decodeRevert);
5753
+ var { toZKsyncError: toZKsyncError2, createErrorHandlers: createErrorHandlers2 } = createErrorOps(decodeRevert2);
5583
5754
 
5584
5755
  // src/core/resources/deposits/gas.ts
5585
5756
  function makeGasQuote(p) {
@@ -5842,7 +6013,7 @@ async function determineErc20L2Gas(input) {
5842
6013
  }
5843
6014
 
5844
6015
  // src/adapters/viem/resources/deposits/services/fee.ts
5845
- var { wrapAs } = createErrorHandlers("deposits");
6016
+ var { wrapAs } = createErrorHandlers2("deposits");
5846
6017
  async function quoteL2BaseCost(input) {
5847
6018
  const { ctx, l2GasLimit } = input;
5848
6019
  const estimator = viemToGasEstimator(ctx.client.l1);
@@ -5892,7 +6063,7 @@ function buildFeeBreakdown(p) {
5892
6063
  }
5893
6064
 
5894
6065
  // src/adapters/viem/resources/deposits/routes/eth.ts
5895
- var { wrapAs: wrapAs2 } = createErrorHandlers("deposits");
6066
+ var { wrapAs: wrapAs2 } = createErrorHandlers2("deposits");
5896
6067
  function routeEthDirect() {
5897
6068
  return {
5898
6069
  async build(p, ctx) {
@@ -5986,29 +6157,7 @@ function routeEthDirect() {
5986
6157
  }
5987
6158
  };
5988
6159
  }
5989
-
5990
- // src/core/utils/addr.ts
5991
- var isHash66 = (x) => !!x && x.startsWith("0x") && x.length === 66;
5992
- function isAddressEq(a, b) {
5993
- return a.toLowerCase() === b.toLowerCase();
5994
- }
5995
- function isETH(token) {
5996
- return isAddressEq(token, FORMAL_ETH_ADDRESS) || isAddressEq(token, L2_BASE_TOKEN_ADDRESS) || isAddressEq(token, ETH_ADDRESS);
5997
- }
5998
- function normalizeAddrEq(a, b) {
5999
- if (!a || !b) return false;
6000
- const normalize = (s) => {
6001
- const hasPrefix = s.slice(0, 2).toLowerCase() === "0x";
6002
- const body = hasPrefix ? s.slice(2) : s;
6003
- return `0x${body.toLowerCase()}`;
6004
- };
6005
- return normalize(a) === normalize(b);
6006
- }
6007
- var hexEq = (a, b) => a.toLowerCase() === b.toLowerCase();
6008
- var normalizeL1Token = (token) => isAddressEq(token, FORMAL_ETH_ADDRESS) ? ETH_ADDRESS : token;
6009
-
6010
- // src/adapters/viem/resources/deposits/routes/erc20-nonbase.ts
6011
- var { wrapAs: wrapAs3 } = createErrorHandlers("deposits");
6160
+ var { wrapAs: wrapAs3 } = createErrorHandlers2("deposits");
6012
6161
  function routeErc20NonBase() {
6013
6162
  return {
6014
6163
  // TODO: do we even need these validations?
@@ -6235,7 +6384,7 @@ function routeErc20NonBase() {
6235
6384
  }
6236
6385
  };
6237
6386
  }
6238
- var { wrapAs: wrapAs4 } = createErrorHandlers("deposits");
6387
+ var { wrapAs: wrapAs4 } = createErrorHandlers2("deposits");
6239
6388
  function routeEthNonBase() {
6240
6389
  return {
6241
6390
  // TODO: do we even need these validations?
@@ -6446,7 +6595,7 @@ function routeEthNonBase() {
6446
6595
  }
6447
6596
  };
6448
6597
  }
6449
- var { wrapAs: wrapAs5 } = createErrorHandlers("deposits");
6598
+ var { wrapAs: wrapAs5 } = createErrorHandlers2("deposits");
6450
6599
  function routeErc20Base() {
6451
6600
  return {
6452
6601
  async preflight(p, ctx) {
@@ -6634,7 +6783,7 @@ var I_BRIDGEHUB_NEW_PRIORITY_REQUEST = {
6634
6783
  { name: "data", type: "bytes", indexed: false }
6635
6784
  ]
6636
6785
  };
6637
- function extractL2TxHashFromL1Logs(logs) {
6786
+ function getL2TransactionHashFromLogs(logs) {
6638
6787
  for (const lg of logs) {
6639
6788
  try {
6640
6789
  const parsed = viem.decodeEventLog({
@@ -6666,7 +6815,7 @@ function extractL2TxHashFromL1Logs(logs) {
6666
6815
  async function waitForL2ExecutionFromL1Tx(l1, l2, l1TxHash) {
6667
6816
  const l1Receipt = await l1.waitForTransactionReceipt({ hash: l1TxHash });
6668
6817
  if (!l1Receipt) throw new Error("No L1 receipt found");
6669
- const l2TxHash = extractL2TxHashFromL1Logs(l1Receipt.logs);
6818
+ const l2TxHash = getL2TransactionHashFromLogs(l1Receipt.logs);
6670
6819
  if (!l2TxHash) {
6671
6820
  throw createError("VERIFICATION", {
6672
6821
  message: "Failed to extract L2 transaction hash from L1 logs",
@@ -6714,7 +6863,7 @@ function createNTVCodec(deps) {
6714
6863
  }
6715
6864
 
6716
6865
  // src/adapters/viem/resources/tokens/tokens.ts
6717
- var { wrapAs: wrapAs6 } = createErrorHandlers("tokens");
6866
+ var { wrapAs: wrapAs6 } = createErrorHandlers2("tokens");
6718
6867
  var ntvCodec = createNTVCodec({
6719
6868
  encode: (types, values) => viem.encodeAbiParameters(
6720
6869
  types.map((t, i) => ({ type: t, name: `arg${i}` })),
@@ -6970,7 +7119,7 @@ function createContractsResource(client) {
6970
7119
  }
6971
7120
 
6972
7121
  // src/adapters/viem/resources/deposits/index.ts
6973
- var { wrap, toResult } = createErrorHandlers("deposits");
7122
+ var { wrap: wrap2, toResult } = createErrorHandlers2("deposits");
6974
7123
  var ROUTES = {
6975
7124
  "eth-base": routeEthDirect(),
6976
7125
  "eth-nonbase": routeEthNonBase(),
@@ -7001,7 +7150,7 @@ function createDepositsResource(client, tokens, contracts) {
7001
7150
  steps
7002
7151
  };
7003
7152
  }
7004
- const quote = async (p) => wrap(
7153
+ const quote = async (p) => wrap2(
7005
7154
  OP_DEPOSITS.quote,
7006
7155
  async () => {
7007
7156
  const plan = await buildPlan(p);
@@ -7016,20 +7165,26 @@ function createDepositsResource(client, tokens, contracts) {
7016
7165
  message: "Internal error while preparing a deposit quote.",
7017
7166
  ctx: { token: p.token, where: "deposits.tryQuote" }
7018
7167
  });
7019
- const prepare = (p) => wrap(OP_DEPOSITS.prepare, () => buildPlan(p), {
7168
+ const prepare = (p) => wrap2(OP_DEPOSITS.prepare, () => buildPlan(p), {
7020
7169
  message: "Internal error while preparing a deposit plan.",
7021
7170
  ctx: { token: p.token, where: "deposits.prepare" }
7022
7171
  });
7023
7172
  const tryPrepare = (p) => toResult(OP_DEPOSITS.tryPrepare, () => prepare(p), {
7024
7173
  ctx: { token: p.token, where: "deposits.tryPrepare" }
7025
7174
  });
7026
- const create = (p) => wrap(
7175
+ const create = (p) => wrap2(
7027
7176
  OP_DEPOSITS.create,
7028
7177
  async () => {
7029
7178
  const plan = await prepare(p);
7030
7179
  const stepHashes = {};
7031
7180
  const from = client.account.address;
7032
- let next = await client.l1.getTransactionCount({ address: from, blockTag: "latest" });
7181
+ let next;
7182
+ if (typeof p.l1TxOverrides?.nonce === "number") {
7183
+ next = p.l1TxOverrides.nonce;
7184
+ } else {
7185
+ const blockTag = p.l1TxOverrides?.nonce ?? "latest";
7186
+ next = await client.l1.getTransactionCount({ address: from, blockTag });
7187
+ }
7033
7188
  for (const step of plan.steps) {
7034
7189
  if (step.kind === "approve") {
7035
7190
  try {
@@ -7047,7 +7202,7 @@ function createDepositsResource(client, tokens, contracts) {
7047
7202
  continue;
7048
7203
  }
7049
7204
  } catch (e) {
7050
- throw toZKsyncError(
7205
+ throw toZKsyncError2(
7051
7206
  "CONTRACT",
7052
7207
  {
7053
7208
  resource: "deposits",
@@ -7128,7 +7283,7 @@ function createDepositsResource(client, tokens, contracts) {
7128
7283
  }
7129
7284
  } catch (e) {
7130
7285
  if (isZKsyncError(e)) throw e;
7131
- throw toZKsyncError(
7286
+ throw toZKsyncError2(
7132
7287
  "EXECUTION",
7133
7288
  {
7134
7289
  resource: "deposits",
@@ -7153,7 +7308,7 @@ function createDepositsResource(client, tokens, contracts) {
7153
7308
  message: "Internal error while creating a deposit.",
7154
7309
  ctx: { token: p.token, amount: p.amount, to: p.to, where: "deposits.tryCreate" }
7155
7310
  });
7156
- const status = (h) => wrap(
7311
+ const status = (h) => wrap2(
7157
7312
  OP_DEPOSITS.status,
7158
7313
  async () => {
7159
7314
  const l1TxHash = typeof h === "string" ? h : h.l1TxHash;
@@ -7162,7 +7317,7 @@ function createDepositsResource(client, tokens, contracts) {
7162
7317
  try {
7163
7318
  l1Rcpt = await client.l1.getTransactionReceipt({ hash: l1TxHash });
7164
7319
  } catch (e) {
7165
- throw toZKsyncError(
7320
+ throw toZKsyncError2(
7166
7321
  "RPC",
7167
7322
  {
7168
7323
  resource: "deposits",
@@ -7176,14 +7331,14 @@ function createDepositsResource(client, tokens, contracts) {
7176
7331
  if (!l1Rcpt) return { phase: "L1_PENDING", l1TxHash };
7177
7332
  let l2TxHash;
7178
7333
  try {
7179
- l2TxHash = extractL2TxHashFromL1Logs(l1Rcpt.logs) ?? void 0;
7334
+ l2TxHash = getL2TransactionHashFromLogs(l1Rcpt.logs) ?? void 0;
7180
7335
  } catch (e) {
7181
- throw toZKsyncError(
7336
+ throw toZKsyncError2(
7182
7337
  "INTERNAL",
7183
7338
  {
7184
7339
  resource: "deposits",
7185
- operation: "deposits.status.extractL2TxHashFromL1Logs",
7186
- context: { where: "extractL2TxHashFromL1Logs", l1TxHash },
7340
+ operation: "deposits.status.getL2TransactionHashFromLogs",
7341
+ context: { where: "getL2TransactionHashFromLogs", l1TxHash },
7187
7342
  message: "Failed to derive L2 transaction hash from L1 logs."
7188
7343
  },
7189
7344
  e
@@ -7197,7 +7352,7 @@ function createDepositsResource(client, tokens, contracts) {
7197
7352
  if (isReceiptNotFound(e)) {
7198
7353
  return { phase: "L2_PENDING", l1TxHash, l2TxHash };
7199
7354
  }
7200
- throw toZKsyncError(
7355
+ throw toZKsyncError2(
7201
7356
  "RPC",
7202
7357
  {
7203
7358
  resource: "deposits",
@@ -7217,7 +7372,7 @@ function createDepositsResource(client, tokens, contracts) {
7217
7372
  ctx: { input: h, where: "deposits.status" }
7218
7373
  }
7219
7374
  );
7220
- const wait = (h, opts) => wrap(
7375
+ const wait = (h, opts) => wrap2(
7221
7376
  OP_DEPOSITS.wait,
7222
7377
  async () => {
7223
7378
  const l1Hash = typeof h === "string" ? h : "l1TxHash" in h ? h.l1TxHash : void 0;
@@ -7226,7 +7381,7 @@ function createDepositsResource(client, tokens, contracts) {
7226
7381
  try {
7227
7382
  l1Receipt = await client.l1.waitForTransactionReceipt({ hash: l1Hash });
7228
7383
  } catch (e) {
7229
- throw toZKsyncError(
7384
+ throw toZKsyncError2(
7230
7385
  "RPC",
7231
7386
  {
7232
7387
  resource: "deposits",
@@ -7244,7 +7399,7 @@ function createDepositsResource(client, tokens, contracts) {
7244
7399
  return l2Receipt ?? null;
7245
7400
  } catch (e) {
7246
7401
  if (isZKsyncError(e)) throw e;
7247
- throw toZKsyncError(
7402
+ throw toZKsyncError2(
7248
7403
  "INTERNAL",
7249
7404
  {
7250
7405
  resource: "deposits",
@@ -7332,7 +7487,7 @@ async function commonCtx2(p, client, tokens, contracts) {
7332
7487
  l2NativeTokenVault,
7333
7488
  l2BaseTokenSystem,
7334
7489
  baseIsEth,
7335
- gasOverrides: p.l2TxOverrides
7490
+ gasOverrides: p.l2TxOverrides ? toGasOverrides(p.l2TxOverrides) : void 0
7336
7491
  };
7337
7492
  }
7338
7493
 
@@ -7425,7 +7580,7 @@ function buildFeeBreakdown2(p) {
7425
7580
  }
7426
7581
 
7427
7582
  // src/adapters/viem/resources/withdrawals/routes/eth.ts
7428
- var { wrapAs: wrapAs7 } = createErrorHandlers("withdrawals");
7583
+ var { wrapAs: wrapAs7 } = createErrorHandlers2("withdrawals");
7429
7584
  function routeEthBase() {
7430
7585
  return {
7431
7586
  async build(p, ctx) {
@@ -7480,7 +7635,7 @@ function routeEthBase() {
7480
7635
  }
7481
7636
  };
7482
7637
  }
7483
- var { wrapAs: wrapAs8 } = createErrorHandlers("withdrawals");
7638
+ var { wrapAs: wrapAs8 } = createErrorHandlers2("withdrawals");
7484
7639
  function routeErc20NonBase2() {
7485
7640
  return {
7486
7641
  // TODO: add preflight validations here
@@ -7553,8 +7708,7 @@ function routeErc20NonBase2() {
7553
7708
  tx: approveTx
7554
7709
  });
7555
7710
  }
7556
- const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l2" }) : void 0);
7557
- const assetId = resolved?.assetId ?? (await wrapAs8(
7711
+ const assetId = (await wrapAs8(
7558
7712
  "CONTRACT",
7559
7713
  OP_WITHDRAWALS.erc20.ensureRegistered,
7560
7714
  () => ctx.client.l2.simulateContract({
@@ -7588,7 +7742,7 @@ function routeErc20NonBase2() {
7588
7742
  value: 0n,
7589
7743
  from: ctx.sender
7590
7744
  };
7591
- const withdrawGas = await quoteL2Gas4({ ctx, tx: withdrawTxCandidate });
7745
+ const withdrawGas = current >= p.amount ? await quoteL2Gas4({ ctx, tx: withdrawTxCandidate }) : void 0;
7592
7746
  if (withdrawGas) {
7593
7747
  withdrawTxCandidate.gas = withdrawGas.gasLimit;
7594
7748
  withdrawTxCandidate.maxFeePerGas = withdrawGas.maxFeePerGas;
@@ -7642,11 +7796,14 @@ function routeErc20NonBase2() {
7642
7796
  };
7643
7797
  }
7644
7798
 
7645
- // src/core/resources/withdrawals/events.ts
7799
+ // src/core/utils/events.ts
7800
+ function extractPreferAddress(opts) {
7801
+ const preferAddr = typeof opts?.prefer === "object" ? opts.prefer.address : opts?.prefer === "assetRouter" ? L2_ASSET_ROUTER_ADDRESS : L1_MESSENGER_ADDRESS;
7802
+ return (preferAddr || L1_MESSENGER_ADDRESS).toLowerCase();
7803
+ }
7646
7804
  function findL1MessageSentLog(receipt, opts) {
7647
7805
  const index = opts?.index;
7648
- const preferAddr = typeof opts?.prefer === "object" ? opts?.prefer.address : opts?.prefer === "assetRouter" ? L2_ASSET_ROUTER_ADDRESS : L1_MESSENGER_ADDRESS;
7649
- const prefer = (preferAddr ?? L1_MESSENGER_ADDRESS).toLowerCase();
7806
+ const preferAddr = extractPreferAddress(opts);
7650
7807
  const matches = receipt.logs.filter((lg) => {
7651
7808
  const t0 = (lg.topics?.[0] ?? "").toLowerCase();
7652
7809
  return t0 === TOPIC_L1_MESSAGE_SENT_NEW || t0 === TOPIC_L1_MESSAGE_SENT_LEG;
@@ -7654,7 +7811,7 @@ function findL1MessageSentLog(receipt, opts) {
7654
7811
  if (!matches.length) {
7655
7812
  throw new Error("No L1MessageSent event found in L2 receipt logs.");
7656
7813
  }
7657
- const preferred = matches.find((lg) => (lg.address ?? "").toLowerCase() === prefer);
7814
+ const preferred = matches.find((lg) => (lg.address ?? "").toLowerCase() === preferAddr);
7658
7815
  const chosen = preferred ?? matches[index] ?? matches[0];
7659
7816
  if (!chosen) {
7660
7817
  throw new Error("No suitable L1MessageSent event found.");
@@ -7673,7 +7830,7 @@ function messengerLogIndex(raw, opts) {
7673
7830
  }
7674
7831
  return (hits[index] ?? hits[0]).i;
7675
7832
  }
7676
- var { wrapAs: wrapAs9 } = createErrorHandlers("withdrawals");
7833
+ var { wrapAs: wrapAs9 } = createErrorHandlers2("withdrawals");
7677
7834
  var IL1NullifierMini = [
7678
7835
  {
7679
7836
  type: "function",
@@ -7780,27 +7937,11 @@ function createFinalizationServices(client) {
7780
7937
  message,
7781
7938
  merkleProof: proof.proof
7782
7939
  };
7783
- const { l1Nullifier } = await wrapAs9(
7784
- "INTERNAL",
7785
- OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7786
- () => client.ensureAddresses(),
7787
- {
7788
- ctx: { where: "ensureAddresses" },
7789
- message: "Failed to ensure L1 Nullifier address."
7790
- }
7791
- );
7940
+ const { l1Nullifier } = await client.ensureAddresses();
7792
7941
  return { params, nullifier: l1Nullifier };
7793
7942
  },
7794
7943
  async simulateFinalizeReadiness(params) {
7795
- const { l1Nullifier } = await wrapAs9(
7796
- "INTERNAL",
7797
- OP_WITHDRAWALS.finalize.readiness.ensureAddresses,
7798
- () => client.ensureAddresses(),
7799
- {
7800
- ctx: { where: "ensureAddresses" },
7801
- message: "Failed to ensure L1 Nullifier address."
7802
- }
7803
- );
7944
+ const { l1Nullifier } = await client.ensureAddresses();
7804
7945
  const done = await (async () => {
7805
7946
  try {
7806
7947
  const result = await wrapAs9(
@@ -7837,15 +7978,7 @@ function createFinalizationServices(client) {
7837
7978
  }
7838
7979
  },
7839
7980
  async isWithdrawalFinalized(key) {
7840
- const { l1Nullifier } = await wrapAs9(
7841
- "INTERNAL",
7842
- OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7843
- () => client.ensureAddresses(),
7844
- {
7845
- ctx: { where: "ensureAddresses" },
7846
- message: "Failed to ensure L1 Nullifier address."
7847
- }
7848
- );
7981
+ const { l1Nullifier } = await client.ensureAddresses();
7849
7982
  return await wrapAs9(
7850
7983
  "RPC",
7851
7984
  OP_WITHDRAWALS.finalize.isFinalized,
@@ -7862,15 +7995,7 @@ function createFinalizationServices(client) {
7862
7995
  );
7863
7996
  },
7864
7997
  async estimateFinalization(params) {
7865
- const { l1Nullifier } = await wrapAs9(
7866
- "INTERNAL",
7867
- OP_WITHDRAWALS.finalize.estimate,
7868
- () => client.ensureAddresses(),
7869
- {
7870
- ctx: { where: "ensureAddresses" },
7871
- message: "Failed to ensure L1 Nullifier address."
7872
- }
7873
- );
7998
+ const { l1Nullifier } = await client.ensureAddresses();
7874
7999
  const gasLimit = await wrapAs9(
7875
8000
  "RPC",
7876
8001
  OP_WITHDRAWALS.finalize.estimate,
@@ -7933,15 +8058,7 @@ function createFinalizationServices(client) {
7933
8058
  };
7934
8059
  },
7935
8060
  async finalizeDeposit(params) {
7936
- const { l1Nullifier } = await wrapAs9(
7937
- "INTERNAL",
7938
- OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7939
- () => client.ensureAddresses(),
7940
- {
7941
- ctx: { where: "ensureAddresses" },
7942
- message: "Failed to ensure L1 Nullifier address."
7943
- }
7944
- );
8061
+ const { l1Nullifier } = await client.ensureAddresses();
7945
8062
  try {
7946
8063
  const hash = await client.l1Wallet.writeContract({
7947
8064
  address: l1Nullifier,
@@ -7956,7 +8073,7 @@ function createFinalizationServices(client) {
7956
8073
  try {
7957
8074
  return await client.l1.waitForTransactionReceipt({ hash });
7958
8075
  } catch (e) {
7959
- throw toZKsyncError(
8076
+ throw toZKsyncError2(
7960
8077
  "EXECUTION",
7961
8078
  {
7962
8079
  resource: "withdrawals",
@@ -7970,7 +8087,7 @@ function createFinalizationServices(client) {
7970
8087
  }
7971
8088
  };
7972
8089
  } catch (e) {
7973
- throw toZKsyncError(
8090
+ throw toZKsyncError2(
7974
8091
  "EXECUTION",
7975
8092
  {
7976
8093
  resource: "withdrawals",
@@ -7999,7 +8116,7 @@ var ROUTES2 = {
7999
8116
  };
8000
8117
  function createWithdrawalsResource(client, tokens, contracts) {
8001
8118
  const svc = createFinalizationServices(client);
8002
- const { wrap: wrap2, toResult: toResult2 } = createErrorHandlers("withdrawals");
8119
+ const { wrap: wrap3, toResult: toResult2 } = createErrorHandlers2("withdrawals");
8003
8120
  const tokensResource = tokens ?? createTokensResource(client);
8004
8121
  const contractsResource = contracts ?? createContractsResource(client);
8005
8122
  async function buildPlan(p) {
@@ -8020,7 +8137,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8020
8137
  };
8021
8138
  }
8022
8139
  const finalizeCache = /* @__PURE__ */ new Map();
8023
- const quote = (p) => wrap2(OP_WITHDRAWALS.quote, async () => (await buildPlan(p)).summary, {
8140
+ const quote = (p) => wrap3(OP_WITHDRAWALS.quote, async () => (await buildPlan(p)).summary, {
8024
8141
  message: "Internal error while preparing a withdrawal quote.",
8025
8142
  ctx: { token: p.token, where: "withdrawals.quote" }
8026
8143
  });
@@ -8028,7 +8145,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8028
8145
  message: "Internal error while preparing a withdrawal quote.",
8029
8146
  ctx: { token: p.token, where: "withdrawals.tryQuote" }
8030
8147
  });
8031
- const prepare = (p) => wrap2(OP_WITHDRAWALS.prepare, () => buildPlan(p), {
8148
+ const prepare = (p) => wrap3(OP_WITHDRAWALS.prepare, () => buildPlan(p), {
8032
8149
  message: "Internal error while preparing a withdrawal plan.",
8033
8150
  ctx: { token: p.token, where: "withdrawals.prepare" }
8034
8151
  });
@@ -8036,12 +8153,20 @@ function createWithdrawalsResource(client, tokens, contracts) {
8036
8153
  message: "Internal error while preparing a withdrawal plan.",
8037
8154
  ctx: { token: p.token, where: "withdrawals.tryPrepare" }
8038
8155
  });
8039
- const create = (p) => wrap2(
8156
+ const create = (p) => wrap3(
8040
8157
  OP_WITHDRAWALS.create,
8041
8158
  async () => {
8042
8159
  const plan = await prepare(p);
8043
8160
  const stepHashes = {};
8044
8161
  const l2Wallet = client.getL2Wallet();
8162
+ const from = client.account.address;
8163
+ let next;
8164
+ if (typeof p.l2TxOverrides?.nonce === "number") {
8165
+ next = p.l2TxOverrides.nonce;
8166
+ } else {
8167
+ const blockTag = p.l2TxOverrides?.nonce ?? "pending";
8168
+ next = await client.l2.getTransactionCount({ address: from, blockTag });
8169
+ }
8045
8170
  for (const step of plan.steps) {
8046
8171
  if (p.l2TxOverrides) {
8047
8172
  const overrides = p.l2TxOverrides;
@@ -8075,6 +8200,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8075
8200
  maxFeePerGas: step.tx.maxFeePerGas,
8076
8201
  maxPriorityFeePerGas: step.tx.maxPriorityFeePerGas
8077
8202
  } : {};
8203
+ const nonce = next++;
8078
8204
  const baseReq = {
8079
8205
  address: step.tx.address,
8080
8206
  abi: step.tx.abi,
@@ -8082,6 +8208,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8082
8208
  args: step.tx.args ?? [],
8083
8209
  account: step.tx.account ?? l2Wallet.account ?? client.account,
8084
8210
  gas: step.tx.gas,
8211
+ nonce,
8085
8212
  ...fee1559,
8086
8213
  ...step.tx.dataSuffix ? { dataSuffix: step.tx.dataSuffix } : {},
8087
8214
  ...step.tx.chain ? { chain: step.tx.chain } : {}
@@ -8109,7 +8236,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8109
8236
  });
8110
8237
  }
8111
8238
  } catch (e) {
8112
- throw toZKsyncError(
8239
+ throw toZKsyncError2(
8113
8240
  "EXECUTION",
8114
8241
  {
8115
8242
  resource: "withdrawals",
@@ -8134,7 +8261,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8134
8261
  message: "Internal error while creating withdrawal transactions.",
8135
8262
  ctx: { token: p.token, amount: p.amount, to: p.to, where: "withdrawals.tryCreate" }
8136
8263
  });
8137
- const status = (h) => wrap2(
8264
+ const status = (h) => wrap3(
8138
8265
  OP_WITHDRAWALS.status,
8139
8266
  async () => {
8140
8267
  const l2TxHash = typeof h === "string" ? h : "l2TxHash" in h && h.l2TxHash ? h.l2TxHash : "0x";
@@ -8148,7 +8275,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8148
8275
  if (isReceiptNotFound(e)) {
8149
8276
  return { phase: "L2_PENDING", l2TxHash };
8150
8277
  }
8151
- throw toZKsyncError(
8278
+ throw toZKsyncError2(
8152
8279
  "RPC",
8153
8280
  {
8154
8281
  resource: "withdrawals",
@@ -8189,7 +8316,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8189
8316
  const wait = (h, opts = {
8190
8317
  for: "l2",
8191
8318
  pollMs: 5500
8192
- }) => wrap2(
8319
+ }) => wrap3(
8193
8320
  OP_WITHDRAWALS.wait,
8194
8321
  async () => {
8195
8322
  const l2Hash = typeof h === "string" ? h : "l2TxHash" in h && h.l2TxHash ? h.l2TxHash : "0x";
@@ -8199,7 +8326,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8199
8326
  try {
8200
8327
  rcpt = await client.l2.waitForTransactionReceipt({ hash: l2Hash });
8201
8328
  } catch (e) {
8202
- throw toZKsyncError(
8329
+ throw toZKsyncError2(
8203
8330
  "RPC",
8204
8331
  {
8205
8332
  resource: "withdrawals",
@@ -8258,7 +8385,7 @@ function createWithdrawalsResource(client, tokens, contracts) {
8258
8385
  }
8259
8386
  }
8260
8387
  );
8261
- const finalize = (l2TxHash) => wrap2(
8388
+ const finalize = (l2TxHash) => wrap3(
8262
8389
  OP_WITHDRAWALS.finalize.send,
8263
8390
  async () => {
8264
8391
  const pack = await (async () => {
@@ -8387,19 +8514,20 @@ exports.classifyReadinessFromRevert = classifyReadinessFromRevert;
8387
8514
  exports.createClient = createViemClient;
8388
8515
  exports.createContractsResource = createContractsResource;
8389
8516
  exports.createDepositsResource = createDepositsResource;
8390
- exports.createErrorHandlers = createErrorHandlers;
8517
+ exports.createErrorHandlers = createErrorHandlers2;
8391
8518
  exports.createFinalizationServices = createFinalizationServices;
8392
8519
  exports.createTokensResource = createTokensResource;
8393
8520
  exports.createViemClient = createViemClient;
8394
8521
  exports.createViemSdk = createViemSdk;
8395
8522
  exports.createWithdrawalsResource = createWithdrawalsResource;
8396
- exports.decodeRevert = decodeRevert;
8523
+ exports.decodeRevert = decodeRevert2;
8397
8524
  exports.encodeNativeTokenVaultTransferData = encodeNativeTokenVaultTransferData;
8398
8525
  exports.encodeSecondBridgeArgs = encodeSecondBridgeArgs;
8399
8526
  exports.encodeSecondBridgeDataV1 = encodeSecondBridgeDataV1;
8400
8527
  exports.encodeSecondBridgeErc20Args = encodeSecondBridgeErc20Args;
8401
8528
  exports.encodeSecondBridgeEthArgs = encodeSecondBridgeEthArgs;
8529
+ exports.getL2TransactionHashFromLogs = getL2TransactionHashFromLogs;
8402
8530
  exports.registerErrorAbi = registerErrorAbi;
8403
- exports.toZKsyncError = toZKsyncError;
8531
+ exports.toZKsyncError = toZKsyncError2;
8404
8532
  //# sourceMappingURL=index.cjs.map
8405
8533
  //# sourceMappingURL=index.cjs.map