@matterlabs/zksync-js 0.0.2 → 0.0.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 (61) hide show
  1. package/dist/adapters/ethers/client.cjs.map +1 -1
  2. package/dist/adapters/ethers/client.js +1 -1
  3. package/dist/adapters/ethers/index.cjs +391 -170
  4. package/dist/adapters/ethers/index.cjs.map +1 -1
  5. package/dist/adapters/ethers/index.d.ts +1 -0
  6. package/dist/adapters/ethers/index.js +4 -4
  7. package/dist/adapters/ethers/resources/contracts/contracts.d.ts +9 -0
  8. package/dist/adapters/ethers/resources/contracts/index.d.ts +2 -0
  9. package/dist/adapters/ethers/resources/contracts/types.d.ts +60 -0
  10. package/dist/adapters/ethers/resources/deposits/context.d.ts +16 -2
  11. package/dist/adapters/ethers/resources/deposits/index.d.ts +3 -1
  12. package/dist/adapters/ethers/resources/deposits/services/gas.d.ts +3 -2
  13. package/dist/adapters/ethers/resources/tokens/index.d.ts +1 -0
  14. package/dist/adapters/ethers/resources/tokens/tokens.d.ts +10 -0
  15. package/dist/adapters/ethers/resources/utils.d.ts +0 -3
  16. package/dist/adapters/ethers/resources/withdrawals/context.d.ts +11 -3
  17. package/dist/adapters/ethers/resources/withdrawals/index.d.ts +3 -1
  18. package/dist/adapters/ethers/sdk.cjs +386 -154
  19. package/dist/adapters/ethers/sdk.cjs.map +1 -1
  20. package/dist/adapters/ethers/sdk.d.ts +5 -22
  21. package/dist/adapters/ethers/sdk.js +3 -3
  22. package/dist/adapters/viem/client.cjs.map +1 -1
  23. package/dist/adapters/viem/index.cjs +383 -176
  24. package/dist/adapters/viem/index.cjs.map +1 -1
  25. package/dist/adapters/viem/index.d.ts +3 -0
  26. package/dist/adapters/viem/index.js +4 -4
  27. package/dist/adapters/viem/resources/contracts/contracts.d.ts +9 -0
  28. package/dist/adapters/viem/resources/contracts/index.d.ts +2 -0
  29. package/dist/adapters/viem/resources/contracts/types.d.ts +61 -0
  30. package/dist/adapters/viem/resources/deposits/context.d.ts +16 -2
  31. package/dist/adapters/viem/resources/deposits/index.d.ts +3 -1
  32. package/dist/adapters/viem/resources/deposits/services/gas.d.ts +2 -1
  33. package/dist/adapters/viem/resources/tokens/index.d.ts +1 -0
  34. package/dist/adapters/viem/resources/tokens/tokens.d.ts +3 -0
  35. package/dist/adapters/viem/resources/utils.d.ts +0 -3
  36. package/dist/adapters/viem/resources/withdrawals/context.d.ts +11 -3
  37. package/dist/adapters/viem/resources/withdrawals/index.d.ts +3 -1
  38. package/dist/adapters/viem/sdk.cjs +401 -189
  39. package/dist/adapters/viem/sdk.cjs.map +1 -1
  40. package/dist/adapters/viem/sdk.d.ts +5 -25
  41. package/dist/adapters/viem/sdk.js +3 -3
  42. package/dist/{chunk-BCCKWWOX.js → chunk-5YWP4CZP.js} +373 -158
  43. package/dist/{chunk-OC6ZVLSP.js → chunk-JXUFGIJG.js} +348 -150
  44. package/dist/{chunk-QJS6ETEE.js → chunk-LL3WKCFJ.js} +15 -1
  45. package/dist/{chunk-HLUANWGN.js → chunk-NEC2ZKHI.js} +4 -12
  46. package/dist/chunk-NTEIA5KA.js +13 -0
  47. package/dist/core/codec/ntv.d.ts +48 -0
  48. package/dist/core/index.cjs +4 -0
  49. package/dist/core/index.cjs.map +1 -1
  50. package/dist/core/index.d.ts +1 -0
  51. package/dist/core/index.js +2 -1
  52. package/dist/core/types/errors.d.ts +1 -1
  53. package/dist/core/types/flows/token.d.ts +192 -0
  54. package/dist/core/utils/addr.d.ts +2 -0
  55. package/dist/index.cjs +4 -0
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.js +2 -1
  59. package/package.json +1 -1
  60. package/dist/adapters/ethers/resources/token-info.d.ts +0 -31
  61. package/dist/adapters/viem/resources/token-info.d.ts +0 -34
@@ -5193,45 +5193,35 @@ function createViemClient(args) {
5193
5193
  };
5194
5194
  }
5195
5195
 
5196
- // src/core/utils/addr.ts
5197
- var isHash66 = (x) => !!x && x.startsWith("0x") && x.length === 66;
5198
- function isAddressEq(a, b) {
5199
- return a.toLowerCase() === b.toLowerCase();
5200
- }
5201
- function isETH(token) {
5202
- return isAddressEq(token, FORMAL_ETH_ADDRESS) || isAddressEq(token, L2_BASE_TOKEN_ADDRESS) || isAddressEq(token, ETH_ADDRESS);
5203
- }
5204
- function normalizeAddrEq(a, b) {
5205
- if (!a || !b) return false;
5206
- const normalize = (s) => {
5207
- const hasPrefix = s.slice(0, 2).toLowerCase() === "0x";
5208
- const body = hasPrefix ? s.slice(2) : s;
5209
- return `0x${body.toLowerCase()}`;
5210
- };
5211
- return normalize(a) === normalize(b);
5212
- }
5213
-
5214
- // src/core/resources/deposits/route.ts
5215
- async function pickDepositRoute(client, chainIdL2, token) {
5216
- if (isETH(token)) {
5217
- const base2 = await client.baseToken(chainIdL2);
5218
- return isETH(base2) ? "eth-base" : "eth-nonbase";
5219
- }
5220
- const base = await client.baseToken(chainIdL2);
5221
- return normalizeAddrEq(token, base) ? "erc20-base" : "erc20-nonbase";
5222
- }
5223
-
5224
5196
  // src/adapters/viem/resources/deposits/context.ts
5225
- async function commonCtx(p, client) {
5226
- const { bridgehub, l1AssetRouter } = await client.ensureAddresses();
5197
+ async function commonCtx(p, client, tokens, contracts) {
5198
+ const { bridgehub, l1AssetRouter } = await contracts.addresses();
5227
5199
  const chainId = await client.l2.getChainId();
5228
5200
  const sender = client.account.address;
5229
5201
  const gasPerPubdata = p.gasPerPubdata ?? 800n;
5230
5202
  const operatorTip = p.operatorTip ?? 0n;
5231
5203
  const refundRecipient = p.refundRecipient ?? sender;
5232
- const route = await pickDepositRoute(client, BigInt(chainId), p.token);
5204
+ const resolvedToken = await tokens.resolve(p.token, { chain: "l1" });
5205
+ const baseTokenAssetId = resolvedToken.baseTokenAssetId;
5206
+ const baseTokenL1 = await tokens.l1TokenFromAssetId(baseTokenAssetId);
5207
+ const baseIsEth = resolvedToken.isChainEthBased;
5208
+ const route = (() => {
5209
+ if (resolvedToken.kind === "eth") {
5210
+ return baseIsEth ? "eth-base" : "eth-nonbase";
5211
+ }
5212
+ if (resolvedToken.kind === "base") {
5213
+ return baseIsEth ? "eth-base" : "erc20-base";
5214
+ }
5215
+ return "erc20-nonbase";
5216
+ })();
5233
5217
  return {
5234
5218
  client,
5219
+ tokens,
5220
+ contracts,
5221
+ resolvedToken,
5222
+ baseTokenAssetId,
5223
+ baseTokenL1,
5224
+ baseIsEth,
5235
5225
  l1AssetRouter,
5236
5226
  route,
5237
5227
  bridgehub,
@@ -5244,17 +5234,6 @@ async function commonCtx(p, client) {
5244
5234
  refundRecipient
5245
5235
  };
5246
5236
  }
5247
- function encodeNativeTokenVaultAssetId(chainId, address) {
5248
- const encoded = viem.encodeAbiParameters(
5249
- [
5250
- { type: "uint256", name: "originChainId" },
5251
- { type: "address", name: "ntv" },
5252
- { type: "address", name: "token" }
5253
- ],
5254
- [chainId, L2_NATIVE_TOKEN_VAULT_ADDRESS, address]
5255
- );
5256
- return viem.keccak256(encoded);
5257
- }
5258
5237
  function encodeNativeTokenVaultTransferData(amount, receiver, token) {
5259
5238
  return viem.encodeAbiParameters(
5260
5239
  [
@@ -5275,8 +5254,6 @@ function encodeSecondBridgeDataV1(assetId, transferData) {
5275
5254
  );
5276
5255
  return viem.concat(["0x01", data]);
5277
5256
  }
5278
- var encodeNTVAssetId = encodeNativeTokenVaultAssetId;
5279
- var encodeNTVTransferData = encodeNativeTokenVaultTransferData;
5280
5257
  function encodeSecondBridgeArgs(token, amount, l2Receiver) {
5281
5258
  return viem.encodeAbiParameters(
5282
5259
  [
@@ -5458,7 +5435,7 @@ function createErrorHandlers(resource) {
5458
5435
  function wrap2(operation, fn, opts) {
5459
5436
  return run("INTERNAL", operation, fn, opts);
5460
5437
  }
5461
- function wrapAs9(kind, operation, fn, opts) {
5438
+ function wrapAs10(kind, operation, fn, opts) {
5462
5439
  return run(kind, operation, fn, opts);
5463
5440
  }
5464
5441
  async function toResult2(operation, fn, opts) {
@@ -5479,7 +5456,7 @@ function createErrorHandlers(resource) {
5479
5456
  return { ok: false, error: shaped };
5480
5457
  }
5481
5458
  }
5482
- return { wrap: wrap2, wrapAs: wrapAs9, toResult: toResult2 };
5459
+ return { wrap: wrap2, wrapAs: wrapAs10, toResult: toResult2 };
5483
5460
  }
5484
5461
 
5485
5462
  // src/core/resources/deposits/gas.ts
@@ -5705,13 +5682,7 @@ async function determineErc20L2Gas(input) {
5705
5682
  });
5706
5683
  }
5707
5684
  try {
5708
- const l2NativeTokenVault = (await ctx.client.contracts()).l2NativeTokenVault;
5709
- const l2TokenAddress = await ctx.client.l2.readContract({
5710
- address: l2NativeTokenVault.address,
5711
- abi: l2NativeTokenVault.abi,
5712
- functionName: "l2TokenAddress",
5713
- args: [l1Token]
5714
- });
5685
+ const l2TokenAddress = ctx.tokens ? await ctx.tokens.toL2Address(l1Token) : await (await ctx.contracts.l2NativeTokenVault()).read.l2TokenAddress([l1Token]);
5715
5686
  if (l2TokenAddress === viem.zeroAddress) {
5716
5687
  return quoteL2Gas2({
5717
5688
  ctx,
@@ -5893,6 +5864,28 @@ function routeEthDirect() {
5893
5864
  }
5894
5865
  };
5895
5866
  }
5867
+
5868
+ // src/core/utils/addr.ts
5869
+ var isHash66 = (x) => !!x && x.startsWith("0x") && x.length === 66;
5870
+ function isAddressEq(a, b) {
5871
+ return a.toLowerCase() === b.toLowerCase();
5872
+ }
5873
+ function isETH(token) {
5874
+ return isAddressEq(token, FORMAL_ETH_ADDRESS) || isAddressEq(token, L2_BASE_TOKEN_ADDRESS) || isAddressEq(token, ETH_ADDRESS);
5875
+ }
5876
+ function normalizeAddrEq(a, b) {
5877
+ if (!a || !b) return false;
5878
+ const normalize = (s) => {
5879
+ const hasPrefix = s.slice(0, 2).toLowerCase() === "0x";
5880
+ const body = hasPrefix ? s.slice(2) : s;
5881
+ return `0x${body.toLowerCase()}`;
5882
+ };
5883
+ return normalize(a) === normalize(b);
5884
+ }
5885
+ var hexEq = (a, b) => a.toLowerCase() === b.toLowerCase();
5886
+ var normalizeL1Token = (token) => isAddressEq(token, FORMAL_ETH_ADDRESS) ? ETH_ADDRESS : token;
5887
+
5888
+ // src/adapters/viem/resources/deposits/routes/erc20-nonbase.ts
5896
5889
  var { wrapAs: wrapAs3 } = createErrorHandlers("deposits");
5897
5890
  function routeErc20NonBase() {
5898
5891
  return {
@@ -5902,18 +5895,18 @@ function routeErc20NonBase() {
5902
5895
  "VALIDATION",
5903
5896
  OP_DEPOSITS.nonbase.assertNotEthAsset,
5904
5897
  () => {
5905
- if (isETH(p.token)) {
5898
+ if (ctx.resolvedToken?.kind === "eth" || isETH(p.token)) {
5906
5899
  throw new Error("erc20-nonbase route requires an ERC-20 token (not ETH).");
5907
5900
  }
5908
5901
  },
5909
5902
  { ctx: { token: p.token } }
5910
5903
  );
5911
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
5904
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
5912
5905
  await wrapAs3(
5913
5906
  "VALIDATION",
5914
5907
  OP_DEPOSITS.nonbase.assertNonBaseToken,
5915
5908
  () => {
5916
- if (normalizeAddrEq(baseToken, p.token)) {
5909
+ if (ctx.resolvedToken?.kind === "base" || normalizeAddrEq(baseToken, p.token)) {
5917
5910
  throw new Error("erc20-nonbase route requires a non-base ERC-20 deposit token.");
5918
5911
  }
5919
5912
  },
@@ -5921,8 +5914,8 @@ function routeErc20NonBase() {
5921
5914
  );
5922
5915
  },
5923
5916
  async build(p, ctx) {
5924
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
5925
- const baseIsEth = isETH(baseToken);
5917
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
5918
+ const baseIsEth = ctx.baseIsEth ?? isETH(baseToken);
5926
5919
  const assetRouter = ctx.l1AssetRouter;
5927
5920
  const l2Gas = await determineErc20L2Gas({
5928
5921
  ctx,
@@ -6129,22 +6122,21 @@ function routeEthNonBase() {
6129
6122
  "VALIDATION",
6130
6123
  OP_DEPOSITS.ethNonBase.assertEthAsset,
6131
6124
  () => {
6132
- if (!isETH(p.token)) {
6125
+ if (ctx.resolvedToken?.kind !== "eth" && !isETH(p.token)) {
6133
6126
  throw new Error("eth-nonbase route requires ETH as the deposit asset.");
6134
6127
  }
6135
6128
  },
6136
6129
  { ctx: { token: p.token } }
6137
6130
  );
6138
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
6139
6131
  await wrapAs4(
6140
6132
  "VALIDATION",
6141
6133
  OP_DEPOSITS.ethNonBase.assertNonEthBase,
6142
6134
  () => {
6143
- if (isETH(baseToken)) {
6135
+ if (ctx.baseIsEth) {
6144
6136
  throw new Error("eth-nonbase route requires target chain base token \u2260 ETH.");
6145
6137
  }
6146
6138
  },
6147
- { ctx: { baseToken, chainIdL2: ctx.chainIdL2 } }
6139
+ { ctx: { baseIsEth: ctx.baseIsEth, chainIdL2: ctx.chainIdL2 } }
6148
6140
  );
6149
6141
  const ethBal = await wrapAs4(
6150
6142
  "RPC",
@@ -6167,7 +6159,7 @@ function routeEthNonBase() {
6167
6159
  );
6168
6160
  },
6169
6161
  async build(p, ctx) {
6170
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
6162
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
6171
6163
  const l2TxModel = {
6172
6164
  to: p.to ?? ctx.sender,
6173
6165
  from: ctx.sender,
@@ -6340,13 +6332,13 @@ function routeErc20Base() {
6340
6332
  "VALIDATION",
6341
6333
  OP_DEPOSITS.base.assertErc20Asset,
6342
6334
  () => {
6343
- if (isETH(p.token)) {
6335
+ if (ctx.resolvedToken?.kind === "eth" || isETH(p.token)) {
6344
6336
  throw new Error("erc20-base route requires an ERC-20 token (not ETH).");
6345
6337
  }
6346
6338
  },
6347
6339
  { ctx: { token: p.token } }
6348
6340
  );
6349
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
6341
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
6350
6342
  await wrapAs5(
6351
6343
  "VALIDATION",
6352
6344
  OP_DEPOSITS.base.assertMatchesBase,
@@ -6359,7 +6351,7 @@ function routeErc20Base() {
6359
6351
  );
6360
6352
  },
6361
6353
  async build(p, ctx) {
6362
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
6354
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
6363
6355
  const l2TxModel = {
6364
6356
  to: p.to ?? ctx.sender,
6365
6357
  from: ctx.sender,
@@ -6585,6 +6577,276 @@ async function waitForL2ExecutionFromL1Tx(l1, l2, l1TxHash) {
6585
6577
  return { l2Receipt, l2TxHash };
6586
6578
  }
6587
6579
 
6580
+ // src/core/codec/ntv.ts
6581
+ function createNTVCodec(deps) {
6582
+ function encodeAssetId(originChainId, ntvAddress, tokenAddress) {
6583
+ const encoded = deps.encode(
6584
+ ["uint256", "address", "address"],
6585
+ [originChainId, ntvAddress, tokenAddress]
6586
+ );
6587
+ return deps.keccak256(encoded);
6588
+ }
6589
+ return {
6590
+ encodeAssetId
6591
+ };
6592
+ }
6593
+
6594
+ // src/adapters/viem/resources/tokens/tokens.ts
6595
+ var { wrapAs: wrapAs6 } = createErrorHandlers("tokens");
6596
+ var ntvCodec = createNTVCodec({
6597
+ encode: (types, values) => viem.encodeAbiParameters(
6598
+ types.map((t, i) => ({ type: t, name: `arg${i}` })),
6599
+ values
6600
+ ),
6601
+ keccak256: (data) => viem.keccak256(data)
6602
+ });
6603
+ function createTokensResource(client) {
6604
+ let l2NtvL1ChainIdPromise = null;
6605
+ let baseTokenAssetIdPromise = null;
6606
+ let wethL1Promise = null;
6607
+ let wethL2Promise = null;
6608
+ async function getL1ChainId() {
6609
+ if (!l2NtvL1ChainIdPromise) {
6610
+ l2NtvL1ChainIdPromise = wrapAs6("INTERNAL", "getL1ChainId", async () => {
6611
+ const { l2NativeTokenVault } = await client.contracts();
6612
+ return await l2NativeTokenVault.read.L1_CHAIN_ID();
6613
+ });
6614
+ }
6615
+ return l2NtvL1ChainIdPromise;
6616
+ }
6617
+ async function getBaseTokenAssetId() {
6618
+ if (!baseTokenAssetIdPromise) {
6619
+ baseTokenAssetIdPromise = wrapAs6("INTERNAL", "baseTokenAssetId", async () => {
6620
+ const { l2NativeTokenVault } = await client.contracts();
6621
+ const assetId = await l2NativeTokenVault.read.BASE_TOKEN_ASSET_ID();
6622
+ return assetId;
6623
+ });
6624
+ }
6625
+ return baseTokenAssetIdPromise;
6626
+ }
6627
+ async function getWethL1() {
6628
+ if (!wethL1Promise) {
6629
+ wethL1Promise = wrapAs6("INTERNAL", "wethL1", async () => {
6630
+ const { l1NativeTokenVault } = await client.contracts();
6631
+ const weth = await l1NativeTokenVault.read.WETH_TOKEN();
6632
+ return weth;
6633
+ });
6634
+ }
6635
+ return wethL1Promise;
6636
+ }
6637
+ async function getWethL2() {
6638
+ if (!wethL2Promise) {
6639
+ wethL2Promise = wrapAs6("INTERNAL", "wethL2", async () => {
6640
+ const { l2NativeTokenVault } = await client.contracts();
6641
+ const weth = await l2NativeTokenVault.read.WETH_TOKEN();
6642
+ return weth;
6643
+ });
6644
+ }
6645
+ return wethL2Promise;
6646
+ }
6647
+ async function toL2Address(l1Token) {
6648
+ return wrapAs6("CONTRACT", "tokens.toL2Address", async () => {
6649
+ const normalized = normalizeL1Token(l1Token);
6650
+ const chainId = BigInt(await client.l2.getChainId());
6651
+ const baseToken = await client.baseToken(chainId);
6652
+ if (isAddressEq(normalized, baseToken)) {
6653
+ return L2_BASE_TOKEN_ADDRESS;
6654
+ }
6655
+ const { l2NativeTokenVault } = await client.contracts();
6656
+ const l2Token = await l2NativeTokenVault.read.l2TokenAddress([normalized]);
6657
+ return l2Token;
6658
+ });
6659
+ }
6660
+ async function toL1Address(l2Token) {
6661
+ return wrapAs6("CONTRACT", "tokens.toL1Address", async () => {
6662
+ if (isAddressEq(l2Token, ETH_ADDRESS)) return ETH_ADDRESS;
6663
+ if (isAddressEq(l2Token, L2_BASE_TOKEN_ADDRESS)) {
6664
+ const chainId = BigInt(await client.l2.getChainId());
6665
+ return await client.baseToken(chainId);
6666
+ }
6667
+ const { l2AssetRouter } = await client.contracts();
6668
+ const l1Token = await l2AssetRouter.read.l1TokenAddress([l2Token]);
6669
+ return l1Token;
6670
+ });
6671
+ }
6672
+ async function assetIdOfL1(l1Token) {
6673
+ return wrapAs6("CONTRACT", "tokens.assetIdOfL1", async () => {
6674
+ const normalized = normalizeL1Token(l1Token);
6675
+ const { l1NativeTokenVault } = await client.contracts();
6676
+ return await l1NativeTokenVault.read.assetId([normalized]);
6677
+ });
6678
+ }
6679
+ async function assetIdOfL2(l2Token) {
6680
+ return wrapAs6("CONTRACT", "tokens.assetIdOfL2", async () => {
6681
+ const { l2NativeTokenVault } = await client.contracts();
6682
+ return await l2NativeTokenVault.read.assetId([l2Token]);
6683
+ });
6684
+ }
6685
+ async function l2TokenFromAssetId(assetId) {
6686
+ return wrapAs6("CONTRACT", "tokens.l2TokenFromAssetId", async () => {
6687
+ const { l2NativeTokenVault } = await client.contracts();
6688
+ return await l2NativeTokenVault.read.tokenAddress([assetId]);
6689
+ });
6690
+ }
6691
+ async function l1TokenFromAssetId(assetId) {
6692
+ return wrapAs6("CONTRACT", "tokens.l1TokenFromAssetId", async () => {
6693
+ const { l1NativeTokenVault } = await client.contracts();
6694
+ return await l1NativeTokenVault.read.tokenAddress([assetId]);
6695
+ });
6696
+ }
6697
+ async function originChainId(assetId) {
6698
+ return wrapAs6("CONTRACT", "tokens.originChainId", async () => {
6699
+ const { l2NativeTokenVault } = await client.contracts();
6700
+ return await l2NativeTokenVault.read.originChainId([assetId]);
6701
+ });
6702
+ }
6703
+ async function baseTokenAssetId() {
6704
+ return getBaseTokenAssetId();
6705
+ }
6706
+ async function isChainEthBased() {
6707
+ return wrapAs6("CONTRACT", "tokens.isChainEthBased", async () => {
6708
+ const baseAssetId = await getBaseTokenAssetId();
6709
+ const l1ChainId = await getL1ChainId();
6710
+ const ethAssetId = ntvCodec.encodeAssetId(
6711
+ l1ChainId,
6712
+ L2_NATIVE_TOKEN_VAULT_ADDRESS,
6713
+ ETH_ADDRESS
6714
+ );
6715
+ return hexEq(baseAssetId, ethAssetId);
6716
+ });
6717
+ }
6718
+ async function wethL1() {
6719
+ return getWethL1();
6720
+ }
6721
+ async function wethL2() {
6722
+ return getWethL2();
6723
+ }
6724
+ async function computeL2BridgedAddress(args) {
6725
+ return wrapAs6("CONTRACT", "tokens.computeL2BridgedAddress", async () => {
6726
+ const normalized = normalizeL1Token(args.l1Token);
6727
+ const { l2NativeTokenVault } = await client.contracts();
6728
+ const predicted = await l2NativeTokenVault.read.calculateCreate2TokenAddress([
6729
+ args.originChainId,
6730
+ normalized
6731
+ ]);
6732
+ return predicted;
6733
+ });
6734
+ }
6735
+ async function resolve(ref, opts) {
6736
+ return wrapAs6("CONTRACT", "tokens.resolve", async () => {
6737
+ let chain;
6738
+ let address;
6739
+ if (typeof ref === "string") {
6740
+ chain = opts?.chain ?? "l1";
6741
+ address = ref;
6742
+ } else {
6743
+ chain = ref.chain;
6744
+ address = ref.address;
6745
+ }
6746
+ let l1;
6747
+ let l2;
6748
+ if (chain === "l1") {
6749
+ l1 = normalizeL1Token(address);
6750
+ l2 = await toL2Address(address);
6751
+ } else {
6752
+ l2 = address;
6753
+ l1 = await toL1Address(address);
6754
+ }
6755
+ const assetId = await assetIdOfL1(l1);
6756
+ const originChainIdVal = await originChainId(assetId);
6757
+ const [baseAssetId, wethL1Addr, wethL2Addr, ethBased] = await Promise.all([
6758
+ baseTokenAssetId(),
6759
+ wethL1(),
6760
+ wethL2(),
6761
+ isChainEthBased()
6762
+ ]);
6763
+ let kind;
6764
+ if (isAddressEq(l1, ETH_ADDRESS)) {
6765
+ kind = "eth";
6766
+ } else if (hexEq(assetId, baseAssetId)) {
6767
+ kind = "base";
6768
+ } else {
6769
+ kind = "erc20";
6770
+ }
6771
+ return {
6772
+ kind,
6773
+ l1,
6774
+ l2,
6775
+ assetId,
6776
+ originChainId: originChainIdVal,
6777
+ isChainEthBased: ethBased,
6778
+ baseTokenAssetId: baseAssetId,
6779
+ wethL1: wethL1Addr,
6780
+ wethL2: wethL2Addr
6781
+ };
6782
+ });
6783
+ }
6784
+ return {
6785
+ resolve,
6786
+ toL2Address,
6787
+ toL1Address,
6788
+ assetIdOfL1,
6789
+ assetIdOfL2,
6790
+ l2TokenFromAssetId,
6791
+ l1TokenFromAssetId,
6792
+ originChainId,
6793
+ baseTokenAssetId,
6794
+ isChainEthBased,
6795
+ wethL1,
6796
+ wethL2,
6797
+ computeL2BridgedAddress
6798
+ };
6799
+ }
6800
+
6801
+ // src/adapters/viem/resources/contracts/contracts.ts
6802
+ function createContractsResource(client) {
6803
+ async function addresses() {
6804
+ return client.ensureAddresses();
6805
+ }
6806
+ async function instances() {
6807
+ return client.contracts();
6808
+ }
6809
+ async function bridgehub() {
6810
+ const { bridgehub: bridgehub2 } = await instances();
6811
+ return bridgehub2;
6812
+ }
6813
+ async function l1AssetRouter() {
6814
+ const { l1AssetRouter: l1AssetRouter2 } = await instances();
6815
+ return l1AssetRouter2;
6816
+ }
6817
+ async function l1NativeTokenVault() {
6818
+ const { l1NativeTokenVault: l1NativeTokenVault2 } = await instances();
6819
+ return l1NativeTokenVault2;
6820
+ }
6821
+ async function l1Nullifier() {
6822
+ const { l1Nullifier: l1Nullifier2 } = await instances();
6823
+ return l1Nullifier2;
6824
+ }
6825
+ async function l2AssetRouter() {
6826
+ const { l2AssetRouter: l2AssetRouter2 } = await instances();
6827
+ return l2AssetRouter2;
6828
+ }
6829
+ async function l2NativeTokenVault() {
6830
+ const { l2NativeTokenVault: l2NativeTokenVault2 } = await instances();
6831
+ return l2NativeTokenVault2;
6832
+ }
6833
+ async function l2BaseTokenSystem() {
6834
+ const { l2BaseTokenSystem: l2BaseTokenSystem2 } = await instances();
6835
+ return l2BaseTokenSystem2;
6836
+ }
6837
+ return {
6838
+ addresses,
6839
+ instances,
6840
+ bridgehub,
6841
+ l1AssetRouter,
6842
+ l1NativeTokenVault,
6843
+ l1Nullifier,
6844
+ l2AssetRouter,
6845
+ l2NativeTokenVault,
6846
+ l2BaseTokenSystem
6847
+ };
6848
+ }
6849
+
6588
6850
  // src/adapters/viem/resources/deposits/index.ts
6589
6851
  var { wrap, toResult } = createErrorHandlers("deposits");
6590
6852
  var ROUTES = {
@@ -6593,9 +6855,11 @@ var ROUTES = {
6593
6855
  "erc20-nonbase": routeErc20NonBase(),
6594
6856
  "erc20-base": routeErc20Base()
6595
6857
  };
6596
- function createDepositsResource(client) {
6858
+ function createDepositsResource(client, tokens, contracts) {
6859
+ const tokensResource = tokens ?? createTokensResource(client);
6860
+ const contractsResource = contracts ?? createContractsResource(client);
6597
6861
  async function buildPlan(p) {
6598
- const ctx = await commonCtx(p, client);
6862
+ const ctx = await commonCtx(p, client, tokensResource, contractsResource);
6599
6863
  const route = ctx.route;
6600
6864
  await ROUTES[route].preflight?.(p, ctx);
6601
6865
  const { steps, approvals, fees } = await ROUTES[route].build(p, ctx);
@@ -6912,32 +7176,8 @@ function pickWithdrawRoute(args) {
6912
7176
  return "erc20-nonbase";
6913
7177
  }
6914
7178
 
6915
- // src/adapters/viem/resources/token-info.ts
6916
- async function ntvBaseAssetId(l2, ntv) {
6917
- return l2.readContract({
6918
- address: ntv,
6919
- abi: L2NativeTokenVault_default,
6920
- functionName: "BASE_TOKEN_ASSET_ID"
6921
- });
6922
- }
6923
- async function ntvL1ChainId(l2, ntv) {
6924
- return l2.readContract({
6925
- address: ntv,
6926
- abi: L2NativeTokenVault_default,
6927
- functionName: "L1_CHAIN_ID"
6928
- });
6929
- }
6930
- async function isEthBasedChain(l2, ntv) {
6931
- const [baseAssetId, l1ChainId] = await Promise.all([
6932
- ntvBaseAssetId(l2, ntv),
6933
- ntvL1ChainId(l2, ntv)
6934
- ]);
6935
- const ethAssetId = encodeNativeTokenVaultAssetId(l1ChainId, ETH_ADDRESS);
6936
- return baseAssetId.toLowerCase() === ethAssetId.toLowerCase();
6937
- }
6938
-
6939
7179
  // src/adapters/viem/resources/withdrawals/context.ts
6940
- async function commonCtx2(p, client) {
7180
+ async function commonCtx2(p, client, tokens, contracts) {
6941
7181
  const sender = client.account.address;
6942
7182
  const {
6943
7183
  bridgehub,
@@ -6946,12 +7186,20 @@ async function commonCtx2(p, client) {
6946
7186
  l2AssetRouter,
6947
7187
  l2NativeTokenVault,
6948
7188
  l2BaseTokenSystem
6949
- } = await client.ensureAddresses();
7189
+ } = await contracts.addresses();
6950
7190
  const chainIdL2 = BigInt(await client.l2.getChainId());
6951
- const baseIsEth = await isEthBasedChain(client.l2, l2NativeTokenVault);
7191
+ const resolvedToken = await tokens.resolve(p.token, { chain: "l2" });
7192
+ const baseTokenAssetId = resolvedToken.baseTokenAssetId;
7193
+ const baseTokenL1 = await tokens.l1TokenFromAssetId(baseTokenAssetId);
7194
+ const baseIsEth = resolvedToken.isChainEthBased;
6952
7195
  const route = pickWithdrawRoute({ token: p.token});
6953
7196
  return {
6954
7197
  client,
7198
+ tokens,
7199
+ contracts,
7200
+ resolvedToken,
7201
+ baseTokenAssetId,
7202
+ baseTokenL1,
6955
7203
  bridgehub,
6956
7204
  chainIdL2,
6957
7205
  sender,
@@ -7055,12 +7303,12 @@ function buildFeeBreakdown2(p) {
7055
7303
  }
7056
7304
 
7057
7305
  // src/adapters/viem/resources/withdrawals/routes/eth.ts
7058
- var { wrapAs: wrapAs6 } = createErrorHandlers("withdrawals");
7306
+ var { wrapAs: wrapAs7 } = createErrorHandlers("withdrawals");
7059
7307
  function routeEthBase() {
7060
7308
  return {
7061
7309
  async build(p, ctx) {
7062
7310
  const steps = [];
7063
- const data = await wrapAs6(
7311
+ const data = await wrapAs7(
7064
7312
  "INTERNAL",
7065
7313
  OP_WITHDRAWALS.eth.encodeWithdraw,
7066
7314
  () => Promise.resolve(
@@ -7110,14 +7358,14 @@ function routeEthBase() {
7110
7358
  }
7111
7359
  };
7112
7360
  }
7113
- var { wrapAs: wrapAs7 } = createErrorHandlers("withdrawals");
7361
+ var { wrapAs: wrapAs8 } = createErrorHandlers("withdrawals");
7114
7362
  function routeErc20NonBase2() {
7115
7363
  return {
7116
7364
  // TODO: add preflight validations here
7117
7365
  async build(p, ctx) {
7118
7366
  const steps = [];
7119
7367
  const approvals = [];
7120
- const current = await wrapAs7(
7368
+ const current = await wrapAs8(
7121
7369
  "CONTRACT",
7122
7370
  OP_WITHDRAWALS.erc20.allowance,
7123
7371
  () => ctx.client.l2.readContract({
@@ -7156,7 +7404,7 @@ function routeErc20NonBase2() {
7156
7404
  approveTxCandidate.maxFeePerGas = approveGas.maxFeePerGas;
7157
7405
  approveTxCandidate.maxPriorityFeePerGas = approveGas.maxPriorityFeePerGas;
7158
7406
  }
7159
- const approveSim = await wrapAs7(
7407
+ const approveSim = await wrapAs8(
7160
7408
  "CONTRACT",
7161
7409
  OP_WITHDRAWALS.erc20.estGas,
7162
7410
  () => ctx.client.l2.simulateContract({
@@ -7183,7 +7431,8 @@ function routeErc20NonBase2() {
7183
7431
  tx: approveTx
7184
7432
  });
7185
7433
  }
7186
- const ensure = await wrapAs7(
7434
+ const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l2" }) : void 0);
7435
+ const assetId = resolved?.assetId ?? (await wrapAs8(
7187
7436
  "CONTRACT",
7188
7437
  OP_WITHDRAWALS.erc20.ensureRegistered,
7189
7438
  () => ctx.client.l2.simulateContract({
@@ -7197,8 +7446,7 @@ function routeErc20NonBase2() {
7197
7446
  ctx: { where: "L2NativeTokenVault.ensureTokenIsRegistered", token: p.token },
7198
7447
  message: "Failed to ensure token is registered in L2NativeTokenVault."
7199
7448
  }
7200
- );
7201
- const assetId = ensure.result;
7449
+ )).result;
7202
7450
  const assetData = viem.encodeAbiParameters(
7203
7451
  [
7204
7452
  { type: "uint256", name: "amount" },
@@ -7235,7 +7483,7 @@ function routeErc20NonBase2() {
7235
7483
  ...withdrawGas
7236
7484
  };
7237
7485
  } else {
7238
- const sim = await wrapAs7(
7486
+ const sim = await wrapAs8(
7239
7487
  "CONTRACT",
7240
7488
  OP_WITHDRAWALS.erc20.estGas,
7241
7489
  () => ctx.client.l2.simulateContract({
@@ -7264,7 +7512,7 @@ function routeErc20NonBase2() {
7264
7512
  tx: withdrawTx
7265
7513
  });
7266
7514
  const fees = buildFeeBreakdown2({
7267
- feeToken: await ctx.client.baseToken(ctx.chainIdL2),
7515
+ feeToken: ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2),
7268
7516
  l2Gas: withdrawGas
7269
7517
  });
7270
7518
  return { steps, approvals, fees };
@@ -7303,7 +7551,7 @@ function messengerLogIndex(raw, opts) {
7303
7551
  }
7304
7552
  return (hits[index] ?? hits[0]).i;
7305
7553
  }
7306
- var { wrapAs: wrapAs8 } = createErrorHandlers("withdrawals");
7554
+ var { wrapAs: wrapAs9 } = createErrorHandlers("withdrawals");
7307
7555
  var IL1NullifierMini = [
7308
7556
  {
7309
7557
  type: "function",
@@ -7320,7 +7568,7 @@ var IL1NullifierMini = [
7320
7568
  function createFinalizationServices(client) {
7321
7569
  return {
7322
7570
  async fetchFinalizeDepositParams(l2TxHash) {
7323
- const parsed = await wrapAs8(
7571
+ const parsed = await wrapAs9(
7324
7572
  "RPC",
7325
7573
  OP_WITHDRAWALS.finalize.fetchParams.receipt,
7326
7574
  () => client.zks.getReceiptWithL2ToL1(l2TxHash),
@@ -7337,7 +7585,7 @@ function createFinalizationServices(client) {
7337
7585
  context: { l2TxHash }
7338
7586
  });
7339
7587
  }
7340
- const ev = await wrapAs8(
7588
+ const ev = await wrapAs9(
7341
7589
  "INTERNAL",
7342
7590
  OP_WITHDRAWALS.finalize.fetchParams.findMessage,
7343
7591
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
@@ -7347,7 +7595,7 @@ function createFinalizationServices(client) {
7347
7595
  message: "Failed to locate L1MessageSent event in L2 receipt."
7348
7596
  }
7349
7597
  );
7350
- const message = await wrapAs8(
7598
+ const message = await wrapAs9(
7351
7599
  "INTERNAL",
7352
7600
  OP_WITHDRAWALS.finalize.fetchParams.decodeMessage,
7353
7601
  () => {
@@ -7359,7 +7607,7 @@ function createFinalizationServices(client) {
7359
7607
  message: "Failed to decode withdrawal message."
7360
7608
  }
7361
7609
  );
7362
- const raw = await wrapAs8(
7610
+ const raw = await wrapAs9(
7363
7611
  "RPC",
7364
7612
  OP_WITHDRAWALS.finalize.fetchParams.rawReceipt,
7365
7613
  () => client.zks.getReceiptWithL2ToL1(l2TxHash),
@@ -7376,7 +7624,7 @@ function createFinalizationServices(client) {
7376
7624
  context: { l2TxHash }
7377
7625
  });
7378
7626
  }
7379
- const idx = await wrapAs8(
7627
+ const idx = await wrapAs9(
7380
7628
  "INTERNAL",
7381
7629
  OP_WITHDRAWALS.finalize.fetchParams.messengerIndex,
7382
7630
  () => Promise.resolve(messengerLogIndex(raw, { index: 0, messenger: L1_MESSENGER_ADDRESS })),
@@ -7385,7 +7633,7 @@ function createFinalizationServices(client) {
7385
7633
  message: "Failed to derive messenger log index."
7386
7634
  }
7387
7635
  );
7388
- const proof = await wrapAs8(
7636
+ const proof = await wrapAs9(
7389
7637
  "RPC",
7390
7638
  OP_WITHDRAWALS.finalize.fetchParams.proof,
7391
7639
  () => client.zks.getL2ToL1LogProof(l2TxHash, idx),
@@ -7394,7 +7642,7 @@ function createFinalizationServices(client) {
7394
7642
  message: "Failed to fetch L2\u2192L1 log proof."
7395
7643
  }
7396
7644
  );
7397
- const chainId = await wrapAs8(
7645
+ const chainId = await wrapAs9(
7398
7646
  "RPC",
7399
7647
  OP_WITHDRAWALS.finalize.fetchParams.network,
7400
7648
  () => client.l2.getChainId(),
@@ -7410,7 +7658,7 @@ function createFinalizationServices(client) {
7410
7658
  message,
7411
7659
  merkleProof: proof.proof
7412
7660
  };
7413
- const { l1Nullifier } = await wrapAs8(
7661
+ const { l1Nullifier } = await wrapAs9(
7414
7662
  "INTERNAL",
7415
7663
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7416
7664
  () => client.ensureAddresses(),
@@ -7422,7 +7670,7 @@ function createFinalizationServices(client) {
7422
7670
  return { params, nullifier: l1Nullifier };
7423
7671
  },
7424
7672
  async simulateFinalizeReadiness(params) {
7425
- const { l1Nullifier } = await wrapAs8(
7673
+ const { l1Nullifier } = await wrapAs9(
7426
7674
  "INTERNAL",
7427
7675
  OP_WITHDRAWALS.finalize.readiness.ensureAddresses,
7428
7676
  () => client.ensureAddresses(),
@@ -7433,7 +7681,7 @@ function createFinalizationServices(client) {
7433
7681
  );
7434
7682
  const done = await (async () => {
7435
7683
  try {
7436
- const result = await wrapAs8(
7684
+ const result = await wrapAs9(
7437
7685
  "RPC",
7438
7686
  OP_WITHDRAWALS.finalize.readiness.isFinalized,
7439
7687
  () => client.l1.readContract({
@@ -7467,7 +7715,7 @@ function createFinalizationServices(client) {
7467
7715
  }
7468
7716
  },
7469
7717
  async isWithdrawalFinalized(key) {
7470
- const { l1Nullifier } = await wrapAs8(
7718
+ const { l1Nullifier } = await wrapAs9(
7471
7719
  "INTERNAL",
7472
7720
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7473
7721
  () => client.ensureAddresses(),
@@ -7476,7 +7724,7 @@ function createFinalizationServices(client) {
7476
7724
  message: "Failed to ensure L1 Nullifier address."
7477
7725
  }
7478
7726
  );
7479
- return await wrapAs8(
7727
+ return await wrapAs9(
7480
7728
  "RPC",
7481
7729
  OP_WITHDRAWALS.finalize.isFinalized,
7482
7730
  () => client.l1.readContract({
@@ -7492,7 +7740,7 @@ function createFinalizationServices(client) {
7492
7740
  );
7493
7741
  },
7494
7742
  async estimateFinalization(params) {
7495
- const { l1Nullifier } = await wrapAs8(
7743
+ const { l1Nullifier } = await wrapAs9(
7496
7744
  "INTERNAL",
7497
7745
  OP_WITHDRAWALS.finalize.estimate,
7498
7746
  () => client.ensureAddresses(),
@@ -7501,7 +7749,7 @@ function createFinalizationServices(client) {
7501
7749
  message: "Failed to ensure L1 Nullifier address."
7502
7750
  }
7503
7751
  );
7504
- const gasLimit = await wrapAs8(
7752
+ const gasLimit = await wrapAs9(
7505
7753
  "RPC",
7506
7754
  OP_WITHDRAWALS.finalize.estimate,
7507
7755
  () => client.l1.estimateContractGas({
@@ -7525,7 +7773,7 @@ function createFinalizationServices(client) {
7525
7773
  let maxFeePerGas;
7526
7774
  let maxPriorityFeePerGas;
7527
7775
  try {
7528
- const fee = await wrapAs8(
7776
+ const fee = await wrapAs9(
7529
7777
  "RPC",
7530
7778
  OP_WITHDRAWALS.finalize.estimate,
7531
7779
  () => client.l1.estimateFeesPerGas(),
@@ -7544,7 +7792,7 @@ function createFinalizationServices(client) {
7544
7792
  })();
7545
7793
  maxPriorityFeePerGas = fee.maxPriorityFeePerGas ?? 0n;
7546
7794
  } catch {
7547
- const gasPrice = await wrapAs8(
7795
+ const gasPrice = await wrapAs9(
7548
7796
  "RPC",
7549
7797
  OP_WITHDRAWALS.finalize.estimate,
7550
7798
  () => client.l1.getGasPrice(),
@@ -7563,7 +7811,7 @@ function createFinalizationServices(client) {
7563
7811
  };
7564
7812
  },
7565
7813
  async finalizeDeposit(params) {
7566
- const { l1Nullifier } = await wrapAs8(
7814
+ const { l1Nullifier } = await wrapAs9(
7567
7815
  "INTERNAL",
7568
7816
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
7569
7817
  () => client.ensureAddresses(),
@@ -7627,11 +7875,13 @@ var ROUTES2 = {
7627
7875
  "erc20-nonbase": routeErc20NonBase2()
7628
7876
  // AssetRouter.withdraw for non-base ERC-20s
7629
7877
  };
7630
- function createWithdrawalsResource(client) {
7878
+ function createWithdrawalsResource(client, tokens, contracts) {
7631
7879
  const svc = createFinalizationServices(client);
7632
7880
  const { wrap: wrap2, toResult: toResult2 } = createErrorHandlers("withdrawals");
7881
+ const tokensResource = tokens ?? createTokensResource(client);
7882
+ const contractsResource = contracts ?? createContractsResource(client);
7633
7883
  async function buildPlan(p) {
7634
- const ctx = await commonCtx2(p, client);
7884
+ const ctx = await commonCtx2(p, client, tokensResource, contractsResource);
7635
7885
  await ROUTES2[ctx.route].preflight?.(p, ctx);
7636
7886
  const { steps, approvals, fees } = await ROUTES2[ctx.route].build(p, ctx);
7637
7887
  return {
@@ -7978,71 +8228,28 @@ function createWithdrawalsResource(client) {
7978
8228
 
7979
8229
  // src/adapters/viem/sdk.ts
7980
8230
  function createViemSdk(client) {
8231
+ const tokens = createTokensResource(client);
8232
+ const contracts = createContractsResource(client);
7981
8233
  return {
7982
- deposits: createDepositsResource(client),
7983
- withdrawals: createWithdrawalsResource(client),
7984
- helpers: {
7985
- addresses: () => client.ensureAddresses(),
7986
- contracts: () => client.contracts(),
7987
- async l1AssetRouter() {
7988
- const { l1AssetRouter } = await client.contracts();
7989
- return l1AssetRouter;
7990
- },
7991
- async l1NativeTokenVault() {
7992
- const { l1NativeTokenVault } = await client.contracts();
7993
- return l1NativeTokenVault;
7994
- },
7995
- async l1Nullifier() {
7996
- const { l1Nullifier } = await client.contracts();
7997
- return l1Nullifier;
7998
- },
7999
- async baseToken(chainId) {
8000
- const id = chainId ?? BigInt(await client.l2.getChainId());
8001
- return client.baseToken(id);
8002
- },
8003
- async l2TokenAddress(l1Token) {
8004
- if (isAddressEq(l1Token, FORMAL_ETH_ADDRESS)) {
8005
- return ETH_ADDRESS;
8006
- }
8007
- const base = await client.baseToken(BigInt(await client.l2.getChainId()));
8008
- if (isAddressEq(l1Token, base)) {
8009
- return L2_BASE_TOKEN_ADDRESS;
8010
- }
8011
- const { l2NativeTokenVault } = await client.contracts();
8012
- const addr = await l2NativeTokenVault.read.l2TokenAddress([l1Token]);
8013
- return addr;
8014
- },
8015
- async l1TokenAddress(l2Token) {
8016
- if (isAddressEq(l2Token, FORMAL_ETH_ADDRESS)) {
8017
- return FORMAL_ETH_ADDRESS;
8018
- }
8019
- const { l2AssetRouter } = await client.contracts();
8020
- const addr = await l2AssetRouter.read.l1TokenAddress([l2Token]);
8021
- return addr;
8022
- },
8023
- async assetId(l1Token) {
8024
- const norm = isAddressEq(l1Token, FORMAL_ETH_ADDRESS) ? ETH_ADDRESS : l1Token;
8025
- const { l1NativeTokenVault } = await client.contracts();
8026
- const id = await l1NativeTokenVault.read.assetId([norm]);
8027
- return id;
8028
- }
8029
- }
8234
+ deposits: createDepositsResource(client, tokens, contracts),
8235
+ withdrawals: createWithdrawalsResource(client, tokens, contracts),
8236
+ tokens,
8237
+ contracts
8030
8238
  };
8031
8239
  }
8032
8240
 
8033
8241
  exports.buildDirectRequestStruct = buildDirectRequestStruct;
8034
8242
  exports.classifyReadinessFromRevert = classifyReadinessFromRevert;
8035
8243
  exports.createClient = createViemClient;
8244
+ exports.createContractsResource = createContractsResource;
8036
8245
  exports.createDepositsResource = createDepositsResource;
8037
8246
  exports.createErrorHandlers = createErrorHandlers;
8038
8247
  exports.createFinalizationServices = createFinalizationServices;
8248
+ exports.createTokensResource = createTokensResource;
8039
8249
  exports.createViemClient = createViemClient;
8040
8250
  exports.createViemSdk = createViemSdk;
8041
8251
  exports.createWithdrawalsResource = createWithdrawalsResource;
8042
8252
  exports.decodeRevert = decodeRevert;
8043
- exports.encodeNTVAssetId = encodeNTVAssetId;
8044
- exports.encodeNTVTransferData = encodeNTVTransferData;
8045
- exports.encodeNativeTokenVaultAssetId = encodeNativeTokenVaultAssetId;
8046
8253
  exports.encodeNativeTokenVaultTransferData = encodeNativeTokenVaultTransferData;
8047
8254
  exports.encodeSecondBridgeArgs = encodeSecondBridgeArgs;
8048
8255
  exports.encodeSecondBridgeDataV1 = encodeSecondBridgeDataV1;