@matterlabs/zksync-js 0.0.2 → 0.0.5

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/README.md +1 -3
  2. package/dist/adapters/ethers/client.cjs.map +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 +3 -3
  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 +3 -3
  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-OC6ZVLSP.js → chunk-JXUFGIJG.js} +348 -150
  43. package/dist/{chunk-QJS6ETEE.js → chunk-LL3WKCFJ.js} +15 -1
  44. package/dist/{chunk-BCCKWWOX.js → chunk-NBJEQAOE.js} +373 -158
  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
@@ -1,8 +1,8 @@
1
1
  import { createErrorHandlers, toZKsyncError, classifyReadinessFromRevert } from './chunk-XRE7H466.js';
2
- import { buildFeeBreakdown, quoteL2Gas, quoteL2BaseCost, quoteL1Gas, quoteL2Gas2 } from './chunk-QJS6ETEE.js';
3
- import { findL1MessageSentLog, messengerLogIndex, isAddressEq, isHash66, pickDepositRoute, isETH, normalizeAddrEq, pickWithdrawRoute } from './chunk-HLUANWGN.js';
4
- import { OP_WITHDRAWALS, IL1Nullifier_default, createError, OP_DEPOSITS, IERC20_default, isZKsyncError, isReceiptNotFound, IBridgehub_default, L2NativeTokenVault_default } from './chunk-M5J2MM2U.js';
5
- import { ETH_ADDRESS, L2_NATIVE_TOKEN_VAULT_ADDRESS, L1_MESSENGER_ADDRESS, L2_ASSET_ROUTER_ADDRESS, FORMAL_ETH_ADDRESS, L2_BASE_TOKEN_ADDRESS, TOPIC_CANONICAL_ASSIGNED, TOPIC_CANONICAL_SUCCESS, SAFE_L1_BRIDGE_GAS } from './chunk-F2ENUV3A.js';
2
+ import { createNTVCodec, buildFeeBreakdown, quoteL2Gas, quoteL2BaseCost, quoteL1Gas, quoteL2Gas2 } from './chunk-LL3WKCFJ.js';
3
+ import { findL1MessageSentLog, messengerLogIndex, normalizeL1Token, isAddressEq, hexEq, isHash66, isETH, normalizeAddrEq, pickWithdrawRoute } from './chunk-NEC2ZKHI.js';
4
+ import { OP_WITHDRAWALS, IL1Nullifier_default, createError, OP_DEPOSITS, IERC20_default, isZKsyncError, isReceiptNotFound } from './chunk-M5J2MM2U.js';
5
+ import { ETH_ADDRESS, L1_MESSENGER_ADDRESS, L2_ASSET_ROUTER_ADDRESS, L2_BASE_TOKEN_ADDRESS, L2_NATIVE_TOKEN_VAULT_ADDRESS, TOPIC_CANONICAL_ASSIGNED, TOPIC_CANONICAL_SUCCESS, SAFE_L1_BRIDGE_GAS } from './chunk-F2ENUV3A.js';
6
6
  import { Interface, AbiCoder, ethers, Contract, NonceManager } from 'ethers';
7
7
 
8
8
  var I_BRIDGEHUB = new Interface([
@@ -70,16 +70,34 @@ async function waitForL2ExecutionFromL1Tx(l1, l2, l1TxHash) {
70
70
  }
71
71
 
72
72
  // src/adapters/ethers/resources/deposits/context.ts
73
- async function commonCtx(p, client) {
74
- const { bridgehub, l1AssetRouter } = await client.ensureAddresses();
73
+ async function commonCtx(p, client, tokens, contracts) {
74
+ const { bridgehub, l1AssetRouter } = await contracts.addresses();
75
75
  const { chainId } = await client.l2.getNetwork();
76
76
  const sender = await client.signer.getAddress();
77
77
  const gasPerPubdata = p.gasPerPubdata ?? 800n;
78
78
  const operatorTip = p.operatorTip ?? 0n;
79
79
  const refundRecipient = p.refundRecipient ?? sender;
80
- const route = await pickDepositRoute(client, BigInt(chainId), p.token);
80
+ const resolvedToken = await tokens.resolve(p.token, { chain: "l1" });
81
+ const baseTokenAssetId = resolvedToken.baseTokenAssetId;
82
+ const baseTokenL1 = await tokens.l1TokenFromAssetId(baseTokenAssetId);
83
+ const baseIsEth = resolvedToken.isChainEthBased;
84
+ const route = (() => {
85
+ if (resolvedToken.kind === "eth") {
86
+ return baseIsEth ? "eth-base" : "eth-nonbase";
87
+ }
88
+ if (resolvedToken.kind === "base") {
89
+ return baseIsEth ? "eth-base" : "erc20-base";
90
+ }
91
+ return "erc20-nonbase";
92
+ })();
81
93
  return {
82
94
  client,
95
+ tokens,
96
+ contracts,
97
+ resolvedToken,
98
+ baseTokenAssetId,
99
+ baseTokenL1,
100
+ baseIsEth,
83
101
  l1AssetRouter,
84
102
  route,
85
103
  bridgehub,
@@ -92,31 +110,14 @@ async function commonCtx(p, client) {
92
110
  refundRecipient
93
111
  };
94
112
  }
95
- function encodeNativeTokenVaultAssetId(chainId, address) {
96
- const abi = new AbiCoder();
97
- const hex = abi.encode(
98
- ["uint256", "address", "address"],
99
- [chainId, L2_NATIVE_TOKEN_VAULT_ADDRESS, address]
100
- );
101
- return ethers.keccak256(hex);
102
- }
103
113
  function encodeNativeTokenVaultTransferData(amount, receiver, token) {
104
114
  return new AbiCoder().encode(["uint256", "address", "address"], [amount, receiver, token]);
105
115
  }
106
116
  function encodeSecondBridgeDataV1(assetId, transferData) {
107
- const abi = new AbiCoder();
108
- const data = abi.encode(["bytes32", "bytes"], [assetId, transferData]);
117
+ const abi2 = new AbiCoder();
118
+ const data = abi2.encode(["bytes32", "bytes"], [assetId, transferData]);
109
119
  return ethers.concat(["0x01", data]);
110
120
  }
111
- function encodeNTVAssetId(chainId, address) {
112
- const abi = new AbiCoder();
113
- const hex = abi.encode(
114
- ["uint256", "address", "address"],
115
- [chainId, L2_NATIVE_TOKEN_VAULT_ADDRESS, address]
116
- );
117
- return ethers.keccak256(hex);
118
- }
119
- var encodeNTVTransferData = encodeNativeTokenVaultTransferData;
120
121
  function encodeSecondBridgeArgs(token, amount, l2Receiver) {
121
122
  return AbiCoder.defaultAbiCoder().encode(
122
123
  ["address", "uint256", "address"],
@@ -214,8 +215,8 @@ function ethersToGasEstimator(provider) {
214
215
 
215
216
  // src/adapters/ethers/resources/deposits/services/fee.ts
216
217
  var { wrapAs } = createErrorHandlers("deposits");
217
- var encode = (abi, fn, args) => {
218
- return new Interface(abi).encodeFunctionData(fn, args);
218
+ var encode = (abi2, fn, args) => {
219
+ return new Interface(abi2).encodeFunctionData(fn, args);
219
220
  };
220
221
  async function quoteL2BaseCost2(input) {
221
222
  const { ctx, l2GasLimit } = input;
@@ -270,8 +271,7 @@ async function determineErc20L2Gas(input) {
270
271
  });
271
272
  }
272
273
  try {
273
- const { l2NativeTokenVault } = await ctx.client.contracts();
274
- const l2TokenAddress = await l2NativeTokenVault.l2TokenAddress(l1Token);
274
+ const l2TokenAddress = ctx.tokens ? await ctx.tokens.toL2Address(l1Token) : await (await ctx.contracts.l2NativeTokenVault()).l2TokenAddress(l1Token);
275
275
  if (l2TokenAddress === "0x0000000000000000000000000000000000000000") {
276
276
  return quoteL2Gas3({
277
277
  ctx,
@@ -312,7 +312,7 @@ async function determineErc20L2Gas(input) {
312
312
  function routeEthDirect() {
313
313
  return {
314
314
  async build(p, ctx) {
315
- const bh = new Contract(ctx.bridgehub, IBridgehub_default, ctx.client.l1);
315
+ const bh = await ctx.contracts.bridgehub();
316
316
  const l2TxModel = {
317
317
  to: p.to ?? ctx.sender,
318
318
  from: ctx.sender,
@@ -389,14 +389,14 @@ function routeEthDirect() {
389
389
  var { wrapAs: wrapAs2 } = createErrorHandlers("deposits");
390
390
  function routeErc20NonBase() {
391
391
  return {
392
- // TODO: do we even need these validations?
393
392
  async preflight(p, ctx) {
394
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
393
+ const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l1" }) : void 0);
394
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
395
395
  await wrapAs2(
396
396
  "VALIDATION",
397
397
  OP_DEPOSITS.nonbase.assertNonBaseToken,
398
398
  () => {
399
- if (normalizeAddrEq(baseToken, p.token)) {
399
+ if (resolved?.kind === "base" || resolved?.kind === "eth") {
400
400
  throw new Error("erc20-nonbase route requires a non-base ERC-20 deposit token.");
401
401
  }
402
402
  },
@@ -405,8 +405,8 @@ function routeErc20NonBase() {
405
405
  },
406
406
  async build(p, ctx) {
407
407
  const l1Signer = ctx.client.getL1Signer();
408
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
409
- const baseIsEth = isETH(baseToken);
408
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
409
+ const baseIsEth = ctx.baseIsEth ?? isETH(baseToken);
410
410
  const l2GasParams = await determineErc20L2Gas({
411
411
  ctx,
412
412
  l1Token: p.token,
@@ -493,7 +493,7 @@ function routeErc20NonBase() {
493
493
  secondBridgeValue: 0n,
494
494
  secondBridgeCalldata
495
495
  };
496
- const bh = (await ctx.client.contracts()).bridgehub;
496
+ const bh = await ctx.contracts.bridgehub();
497
497
  const data = bh.interface.encodeFunctionData("requestL2TransactionTwoBridges", [
498
498
  requestStruct
499
499
  ]);
@@ -542,26 +542,26 @@ var { wrapAs: wrapAs3 } = createErrorHandlers("deposits");
542
542
  function routeEthNonBase() {
543
543
  return {
544
544
  async preflight(p, ctx) {
545
+ const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l1" }) : void 0);
545
546
  await wrapAs3(
546
547
  "VALIDATION",
547
548
  OP_DEPOSITS.ethNonBase.assertEthAsset,
548
549
  () => {
549
- if (!isETH(p.token)) {
550
+ if (resolved?.kind !== "eth" && !isETH(p.token)) {
550
551
  throw new Error("eth-nonbase route requires ETH as the deposit asset.");
551
552
  }
552
553
  },
553
554
  { ctx: { token: p.token } }
554
555
  );
555
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
556
556
  await wrapAs3(
557
557
  "VALIDATION",
558
558
  OP_DEPOSITS.ethNonBase.assertNonEthBase,
559
559
  () => {
560
- if (isETH(baseToken)) {
560
+ if (ctx.baseIsEth) {
561
561
  throw new Error("eth-nonbase route requires target chain base token \u2260 ETH.");
562
562
  }
563
563
  },
564
- { ctx: { baseToken, chainIdL2: ctx.chainIdL2 } }
564
+ { ctx: { baseIsEth: ctx.baseIsEth, chainIdL2: ctx.chainIdL2 } }
565
565
  );
566
566
  const ethBal = await wrapAs3(
567
567
  "RPC",
@@ -586,7 +586,7 @@ function routeEthNonBase() {
586
586
  },
587
587
  async build(p, ctx) {
588
588
  const l1Signer = ctx.client.getL1Signer();
589
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
589
+ const baseToken = ctx.baseTokenL1;
590
590
  const l2TxModel = {
591
591
  to: p.to ?? ctx.sender,
592
592
  from: ctx.sender,
@@ -651,11 +651,10 @@ function routeEthNonBase() {
651
651
  secondBridgeValue: p.amount,
652
652
  secondBridgeCalldata
653
653
  };
654
- const data = new Contract(
655
- ctx.bridgehub,
656
- IBridgehub_default,
657
- ctx.client.l1
658
- ).interface.encodeFunctionData("requestL2TransactionTwoBridges", [requestStruct]);
654
+ const bridgehub = await ctx.contracts.bridgehub();
655
+ const data = bridgehub.interface.encodeFunctionData("requestL2TransactionTwoBridges", [
656
+ requestStruct
657
+ ]);
659
658
  const l1TxCandidate = {
660
659
  to: ctx.bridgehub,
661
660
  data,
@@ -701,17 +700,18 @@ var { wrapAs: wrapAs4 } = createErrorHandlers("deposits");
701
700
  function routeErc20Base() {
702
701
  return {
703
702
  async preflight(p, ctx) {
703
+ const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l1" }) : void 0);
704
704
  await wrapAs4(
705
705
  "VALIDATION",
706
706
  OP_DEPOSITS.base.assertErc20Asset,
707
707
  () => {
708
- if (isETH(p.token)) {
708
+ if (resolved?.kind === "eth" || isETH(p.token)) {
709
709
  throw new Error("erc20-base route requires an ERC-20 token (not ETH).");
710
710
  }
711
711
  },
712
712
  { ctx: { token: p.token } }
713
713
  );
714
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
714
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
715
715
  await wrapAs4(
716
716
  "VALIDATION",
717
717
  OP_DEPOSITS.base.assertMatchesBase,
@@ -726,7 +726,7 @@ function routeErc20Base() {
726
726
  },
727
727
  async build(p, ctx) {
728
728
  const l1Signer = ctx.client.getL1Signer();
729
- const baseToken = await ctx.client.baseToken(ctx.chainIdL2);
729
+ const baseToken = ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2);
730
730
  const l2TxModel = {
731
731
  to: p.to ?? ctx.sender,
732
732
  from: ctx.sender,
@@ -779,11 +779,10 @@ function routeErc20Base() {
779
779
  l2Contract: p.to ?? ctx.sender,
780
780
  l2Value: p.amount
781
781
  });
782
- const data = new Contract(
783
- ctx.bridgehub,
784
- IBridgehub_default,
785
- ctx.client.l1
786
- ).interface.encodeFunctionData("requestL2TransactionDirect", [requestStruct]);
782
+ const bridgehub = await ctx.contracts.bridgehub();
783
+ const data = bridgehub.interface.encodeFunctionData("requestL2TransactionDirect", [
784
+ requestStruct
785
+ ]);
787
786
  const l1TxCandidate = {
788
787
  to: ctx.bridgehub,
789
788
  data,
@@ -825,6 +824,266 @@ function routeErc20Base() {
825
824
  }
826
825
  };
827
826
  }
827
+ var { wrapAs: wrapAs5 } = createErrorHandlers("tokens");
828
+ var abi = AbiCoder.defaultAbiCoder();
829
+ var ntvCodec = createNTVCodec({
830
+ encode: (types, values) => abi.encode(types, values),
831
+ keccak256: (data) => ethers.keccak256(data)
832
+ });
833
+ function createTokensResource(client) {
834
+ let l2NtvL1ChainIdPromise = null;
835
+ let baseTokenAssetIdPromise = null;
836
+ let wethL1Promise = null;
837
+ let wethL2Promise = null;
838
+ async function getL1ChainId() {
839
+ if (!l2NtvL1ChainIdPromise) {
840
+ l2NtvL1ChainIdPromise = wrapAs5("INTERNAL", "getL1ChainId", async () => {
841
+ const { l2NativeTokenVault } = await client.contracts();
842
+ const chainId = await l2NativeTokenVault.L1_CHAIN_ID();
843
+ return chainId;
844
+ });
845
+ }
846
+ return l2NtvL1ChainIdPromise;
847
+ }
848
+ async function getBaseTokenAssetId() {
849
+ if (!baseTokenAssetIdPromise) {
850
+ baseTokenAssetIdPromise = wrapAs5("INTERNAL", "baseTokenAssetId", async () => {
851
+ const { l2NativeTokenVault } = await client.contracts();
852
+ const assetId = await l2NativeTokenVault.BASE_TOKEN_ASSET_ID();
853
+ return assetId;
854
+ });
855
+ }
856
+ return baseTokenAssetIdPromise;
857
+ }
858
+ async function getWethL1() {
859
+ if (!wethL1Promise) {
860
+ wethL1Promise = wrapAs5("INTERNAL", "wethL1", async () => {
861
+ const { l1NativeTokenVault } = await client.contracts();
862
+ const weth = await l1NativeTokenVault.WETH_TOKEN();
863
+ return weth;
864
+ });
865
+ }
866
+ return wethL1Promise;
867
+ }
868
+ async function getWethL2() {
869
+ if (!wethL2Promise) {
870
+ wethL2Promise = wrapAs5("INTERNAL", "wethL2", async () => {
871
+ const { l2NativeTokenVault } = await client.contracts();
872
+ const weth = await l2NativeTokenVault.WETH_TOKEN();
873
+ return weth;
874
+ });
875
+ }
876
+ return wethL2Promise;
877
+ }
878
+ async function toL2Address(l1Token) {
879
+ return wrapAs5("CONTRACT", "tokens.toL2Address", async () => {
880
+ const normalized = normalizeL1Token(l1Token);
881
+ const { chainId } = await client.l2.getNetwork();
882
+ const baseToken = await client.baseToken(BigInt(chainId));
883
+ if (isAddressEq(normalized, baseToken)) {
884
+ return L2_BASE_TOKEN_ADDRESS;
885
+ }
886
+ const { l2NativeTokenVault } = await client.contracts();
887
+ const l2Token = await l2NativeTokenVault.l2TokenAddress(normalized);
888
+ return l2Token;
889
+ });
890
+ }
891
+ async function toL1Address(l2Token) {
892
+ return wrapAs5("CONTRACT", "tokens.toL1Address", async () => {
893
+ if (isAddressEq(l2Token, ETH_ADDRESS)) {
894
+ return ETH_ADDRESS;
895
+ }
896
+ if (isAddressEq(l2Token, L2_BASE_TOKEN_ADDRESS)) {
897
+ const { chainId } = await client.l2.getNetwork();
898
+ return await client.baseToken(BigInt(chainId));
899
+ }
900
+ const { l2AssetRouter } = await client.contracts();
901
+ const l1Token = await l2AssetRouter.l1TokenAddress(l2Token);
902
+ return l1Token;
903
+ });
904
+ }
905
+ async function assetIdOfL1(l1Token) {
906
+ return wrapAs5("CONTRACT", "tokens.assetIdOfL1", async () => {
907
+ const normalized = normalizeL1Token(l1Token);
908
+ const { l1NativeTokenVault } = await client.contracts();
909
+ const assetId = await l1NativeTokenVault.assetId(normalized);
910
+ return assetId;
911
+ });
912
+ }
913
+ async function assetIdOfL2(l2Token) {
914
+ return wrapAs5("CONTRACT", "tokens.assetIdOfL2", async () => {
915
+ const { l2NativeTokenVault } = await client.contracts();
916
+ const assetId = await l2NativeTokenVault.assetId(l2Token);
917
+ return assetId;
918
+ });
919
+ }
920
+ async function l2TokenFromAssetId(assetId) {
921
+ return wrapAs5("CONTRACT", "tokens.l2TokenFromAssetId", async () => {
922
+ const { l2NativeTokenVault } = await client.contracts();
923
+ const tokenAddr = await l2NativeTokenVault.tokenAddress(assetId);
924
+ return tokenAddr;
925
+ });
926
+ }
927
+ async function l1TokenFromAssetId(assetId) {
928
+ return wrapAs5("CONTRACT", "tokens.l1TokenFromAssetId", async () => {
929
+ const { l1NativeTokenVault } = await client.contracts();
930
+ const tokenAddr = await l1NativeTokenVault.tokenAddress(assetId);
931
+ return tokenAddr;
932
+ });
933
+ }
934
+ async function originChainId(assetId) {
935
+ return wrapAs5("CONTRACT", "tokens.originChainId", async () => {
936
+ const { l2NativeTokenVault } = await client.contracts();
937
+ const chainId = await l2NativeTokenVault.originChainId(assetId);
938
+ return chainId;
939
+ });
940
+ }
941
+ async function baseTokenAssetId() {
942
+ return getBaseTokenAssetId();
943
+ }
944
+ async function isChainEthBased() {
945
+ return wrapAs5("CONTRACT", "tokens.isChainEthBased", async () => {
946
+ const baseAssetId = await getBaseTokenAssetId();
947
+ const l1ChainId = await getL1ChainId();
948
+ const ethAssetId = ntvCodec.encodeAssetId(
949
+ l1ChainId,
950
+ L2_NATIVE_TOKEN_VAULT_ADDRESS,
951
+ ETH_ADDRESS
952
+ );
953
+ return hexEq(baseAssetId, ethAssetId);
954
+ });
955
+ }
956
+ async function wethL1() {
957
+ return getWethL1();
958
+ }
959
+ async function wethL2() {
960
+ return getWethL2();
961
+ }
962
+ async function computeL2BridgedAddress(args) {
963
+ return wrapAs5("CONTRACT", "tokens.computeL2BridgedAddress", async () => {
964
+ const normalized = normalizeL1Token(args.l1Token);
965
+ const { l2NativeTokenVault } = await client.contracts();
966
+ const predicted = await l2NativeTokenVault.calculateCreate2TokenAddress(
967
+ args.originChainId,
968
+ normalized
969
+ );
970
+ return predicted;
971
+ });
972
+ }
973
+ async function resolve(ref, opts) {
974
+ return wrapAs5("CONTRACT", "tokens.resolve", async () => {
975
+ let chain;
976
+ let address;
977
+ if (typeof ref === "string") {
978
+ chain = opts?.chain ?? "l1";
979
+ address = ref;
980
+ } else {
981
+ chain = ref.chain;
982
+ address = ref.address;
983
+ }
984
+ let l1;
985
+ let l2;
986
+ if (chain === "l1") {
987
+ l1 = normalizeL1Token(address);
988
+ l2 = await toL2Address(address);
989
+ } else {
990
+ l2 = address;
991
+ l1 = await toL1Address(address);
992
+ }
993
+ const assetId = await assetIdOfL1(l1);
994
+ const originChainIdVal = await originChainId(assetId);
995
+ const [baseAssetId, wethL1Addr, wethL2Addr, ethBased] = await Promise.all([
996
+ baseTokenAssetId(),
997
+ wethL1(),
998
+ wethL2(),
999
+ isChainEthBased()
1000
+ ]);
1001
+ let kind;
1002
+ if (isAddressEq(l1, ETH_ADDRESS)) {
1003
+ kind = "eth";
1004
+ } else if (hexEq(assetId, baseAssetId)) {
1005
+ kind = "base";
1006
+ } else {
1007
+ kind = "erc20";
1008
+ }
1009
+ return {
1010
+ kind,
1011
+ l1,
1012
+ l2,
1013
+ assetId,
1014
+ originChainId: originChainIdVal,
1015
+ isChainEthBased: ethBased,
1016
+ baseTokenAssetId: baseAssetId,
1017
+ wethL1: wethL1Addr,
1018
+ wethL2: wethL2Addr
1019
+ };
1020
+ });
1021
+ }
1022
+ return {
1023
+ resolve,
1024
+ toL2Address,
1025
+ toL1Address,
1026
+ assetIdOfL1,
1027
+ assetIdOfL2,
1028
+ l2TokenFromAssetId,
1029
+ l1TokenFromAssetId,
1030
+ originChainId,
1031
+ baseTokenAssetId,
1032
+ isChainEthBased,
1033
+ wethL1,
1034
+ wethL2,
1035
+ computeL2BridgedAddress
1036
+ };
1037
+ }
1038
+
1039
+ // src/adapters/ethers/resources/contracts/contracts.ts
1040
+ function createContractsResource(client) {
1041
+ async function addresses() {
1042
+ return client.ensureAddresses();
1043
+ }
1044
+ async function instances() {
1045
+ return client.contracts();
1046
+ }
1047
+ async function bridgehub() {
1048
+ const { bridgehub: bridgehub2 } = await instances();
1049
+ return bridgehub2;
1050
+ }
1051
+ async function l1AssetRouter() {
1052
+ const { l1AssetRouter: l1AssetRouter2 } = await instances();
1053
+ return l1AssetRouter2;
1054
+ }
1055
+ async function l1NativeTokenVault() {
1056
+ const { l1NativeTokenVault: l1NativeTokenVault2 } = await instances();
1057
+ return l1NativeTokenVault2;
1058
+ }
1059
+ async function l1Nullifier() {
1060
+ const { l1Nullifier: l1Nullifier2 } = await instances();
1061
+ return l1Nullifier2;
1062
+ }
1063
+ async function l2AssetRouter() {
1064
+ const { l2AssetRouter: l2AssetRouter2 } = await instances();
1065
+ return l2AssetRouter2;
1066
+ }
1067
+ async function l2NativeTokenVault() {
1068
+ const { l2NativeTokenVault: l2NativeTokenVault2 } = await instances();
1069
+ return l2NativeTokenVault2;
1070
+ }
1071
+ async function l2BaseTokenSystem() {
1072
+ const { l2BaseTokenSystem: l2BaseTokenSystem2 } = await instances();
1073
+ return l2BaseTokenSystem2;
1074
+ }
1075
+ return {
1076
+ addresses,
1077
+ instances,
1078
+ bridgehub,
1079
+ l1AssetRouter,
1080
+ l1NativeTokenVault,
1081
+ l1Nullifier,
1082
+ l2AssetRouter,
1083
+ l2NativeTokenVault,
1084
+ l2BaseTokenSystem
1085
+ };
1086
+ }
828
1087
 
829
1088
  // src/adapters/ethers/resources/deposits/index.ts
830
1089
  var { wrap, toResult } = createErrorHandlers("deposits");
@@ -834,9 +1093,11 @@ var ROUTES = {
834
1093
  "erc20-nonbase": routeErc20NonBase(),
835
1094
  "erc20-base": routeErc20Base()
836
1095
  };
837
- function createDepositsResource(client) {
1096
+ function createDepositsResource(client, tokens, contracts) {
1097
+ const tokensResource = tokens ?? createTokensResource(client);
1098
+ const contractsResource = contracts ?? createContractsResource(client);
838
1099
  async function buildPlan(p) {
839
- const ctx = await commonCtx(p, client);
1100
+ const ctx = await commonCtx(p, client, tokensResource, contractsResource);
840
1101
  const route = ctx.route;
841
1102
  await ROUTES[route].preflight?.(p, ctx);
842
1103
  const { steps, approvals, fees } = await ROUTES[route].build(p, ctx);
@@ -1101,25 +1362,9 @@ function createDepositsResource(client) {
1101
1362
  );
1102
1363
  return { quote, tryQuote, prepare, tryPrepare, create, tryCreate, status, wait, tryWait };
1103
1364
  }
1104
- async function ntvBaseAssetId(l2, ntv) {
1105
- const c = new Contract(ntv, L2NativeTokenVault_default, l2);
1106
- return await c.BASE_TOKEN_ASSET_ID();
1107
- }
1108
- async function ntvL1ChainId(l2, ntv) {
1109
- const c = new Contract(ntv, L2NativeTokenVault_default, l2);
1110
- return await c.L1_CHAIN_ID();
1111
- }
1112
- async function isEthBasedChain(l2, ntv) {
1113
- const [baseAssetId, l1ChainId] = await Promise.all([
1114
- ntvBaseAssetId(l2, ntv),
1115
- ntvL1ChainId(l2, ntv)
1116
- ]);
1117
- const ethAssetId = encodeNativeTokenVaultAssetId(l1ChainId, ETH_ADDRESS);
1118
- return baseAssetId.toLowerCase() === ethAssetId.toLowerCase();
1119
- }
1120
1365
 
1121
1366
  // src/adapters/ethers/resources/withdrawals/context.ts
1122
- async function commonCtx2(p, client) {
1367
+ async function commonCtx2(p, client, tokens, contracts) {
1123
1368
  const sender = await client.signer.getAddress();
1124
1369
  const {
1125
1370
  bridgehub,
@@ -1128,13 +1373,21 @@ async function commonCtx2(p, client) {
1128
1373
  l2AssetRouter,
1129
1374
  l2NativeTokenVault,
1130
1375
  l2BaseTokenSystem
1131
- } = await client.ensureAddresses();
1376
+ } = await contracts.addresses();
1132
1377
  const { chainId } = await client.l2.getNetwork();
1133
1378
  const chainIdL2 = BigInt(chainId);
1134
- const baseIsEth = await isEthBasedChain(client.l2, l2NativeTokenVault);
1379
+ const resolvedToken = await tokens.resolve(p.token, { chain: "l2" });
1380
+ const baseTokenAssetId = resolvedToken.baseTokenAssetId;
1381
+ const baseTokenL1 = await tokens.l1TokenFromAssetId(baseTokenAssetId);
1382
+ const baseIsEth = resolvedToken.isChainEthBased;
1135
1383
  const route = pickWithdrawRoute({ token: p.token, baseIsEth });
1136
1384
  return {
1137
1385
  client,
1386
+ tokens,
1387
+ contracts,
1388
+ resolvedToken,
1389
+ baseTokenAssetId,
1390
+ baseTokenL1,
1138
1391
  bridgehub,
1139
1392
  chainIdL2,
1140
1393
  sender,
@@ -1177,13 +1430,13 @@ function buildFeeBreakdown2(p) {
1177
1430
  }
1178
1431
 
1179
1432
  // src/adapters/ethers/resources/withdrawals/routes/eth.ts
1180
- var { wrapAs: wrapAs5 } = createErrorHandlers("withdrawals");
1433
+ var { wrapAs: wrapAs6 } = createErrorHandlers("withdrawals");
1181
1434
  function routeEthBase() {
1182
1435
  return {
1183
1436
  async build(p, ctx) {
1184
1437
  const steps = [];
1185
- const base = (await ctx.client.contracts()).l2BaseTokenSystem;
1186
- const data = await wrapAs5(
1438
+ const base = await ctx.contracts.l2BaseTokenSystem();
1439
+ const data = await wrapAs6(
1187
1440
  "INTERNAL",
1188
1441
  OP_WITHDRAWALS.eth.encodeWithdraw,
1189
1442
  () => Promise.resolve(base.interface.encodeFunctionData("withdraw", [p.to ?? ctx.sender])),
@@ -1218,7 +1471,7 @@ function routeEthBase() {
1218
1471
  }
1219
1472
  };
1220
1473
  }
1221
- var { wrapAs: wrapAs6 } = createErrorHandlers("withdrawals");
1474
+ var { wrapAs: wrapAs7 } = createErrorHandlers("withdrawals");
1222
1475
  var SIG = {
1223
1476
  withdraw: "withdraw(bytes32,bytes)"
1224
1477
  };
@@ -1228,7 +1481,7 @@ function routeErc20NonBase2() {
1228
1481
  const steps = [];
1229
1482
  const approvals = [];
1230
1483
  const erc20 = new Contract(p.token, IERC20_default, ctx.client.getL2Signer());
1231
- const current = await wrapAs6(
1484
+ const current = await wrapAs7(
1232
1485
  "CONTRACT",
1233
1486
  OP_WITHDRAWALS.erc20.allowance,
1234
1487
  () => erc20.allowance(ctx.sender, ctx.l2NativeTokenVault),
@@ -1266,17 +1519,21 @@ function routeErc20NonBase2() {
1266
1519
  tx: approveTx
1267
1520
  });
1268
1521
  }
1269
- const ntv = (await ctx.client.contracts()).l2NativeTokenVault;
1270
- const assetId = await wrapAs6(
1522
+ const resolved = ctx.resolvedToken ?? (ctx.tokens ? await ctx.tokens.resolve(p.token, { chain: "l2" }) : void 0);
1523
+ const assetId = resolved?.assetId ?? await wrapAs7(
1271
1524
  "CONTRACT",
1272
1525
  OP_WITHDRAWALS.erc20.ensureRegistered,
1273
- () => ntv.getFunction("ensureTokenIsRegistered").staticCall(p.token),
1526
+ async () => {
1527
+ const ntv = await ctx.contracts.l2NativeTokenVault();
1528
+ const ensured = await ntv.getFunction("ensureTokenIsRegistered").staticCall(p.token);
1529
+ return ensured;
1530
+ },
1274
1531
  {
1275
1532
  ctx: { where: "L2NativeTokenVault.ensureTokenIsRegistered", token: p.token },
1276
1533
  message: "Failed to ensure token is registered in L2NativeTokenVault."
1277
1534
  }
1278
1535
  );
1279
- const assetData = await wrapAs6(
1536
+ const assetData = await wrapAs7(
1280
1537
  "INTERNAL",
1281
1538
  OP_WITHDRAWALS.erc20.encodeAssetData,
1282
1539
  () => Promise.resolve(
@@ -1287,8 +1544,8 @@ function routeErc20NonBase2() {
1287
1544
  message: "Failed to encode burn/withdraw asset data."
1288
1545
  }
1289
1546
  );
1290
- const l2ar = (await ctx.client.contracts()).l2AssetRouter;
1291
- const dataWithdraw = await wrapAs6(
1547
+ const l2ar = await ctx.contracts.l2AssetRouter();
1548
+ const dataWithdraw = await wrapAs7(
1292
1549
  "INTERNAL",
1293
1550
  OP_WITHDRAWALS.erc20.encodeWithdraw,
1294
1551
  () => Promise.resolve(l2ar.interface.encodeFunctionData(SIG.withdraw, [assetId, assetData])),
@@ -1315,14 +1572,14 @@ function routeErc20NonBase2() {
1315
1572
  tx: withdrawTx
1316
1573
  });
1317
1574
  const fees = buildFeeBreakdown2({
1318
- feeToken: await ctx.client.baseToken(ctx.chainIdL2),
1575
+ feeToken: ctx.baseTokenL1 ?? await ctx.client.baseToken(ctx.chainIdL2),
1319
1576
  l2Gas: withdrawGas
1320
1577
  });
1321
1578
  return { steps, approvals, fees };
1322
1579
  }
1323
1580
  };
1324
1581
  }
1325
- var { wrapAs: wrapAs7 } = createErrorHandlers("withdrawals");
1582
+ var { wrapAs: wrapAs8 } = createErrorHandlers("withdrawals");
1326
1583
  var IL1NullifierMini = [
1327
1584
  "function isWithdrawalFinalized(uint256,uint256,uint256) view returns (bool)"
1328
1585
  ];
@@ -1330,7 +1587,7 @@ function createFinalizationServices(client) {
1330
1587
  const { l1, l2, signer } = client;
1331
1588
  return {
1332
1589
  async fetchFinalizeDepositParams(l2TxHash) {
1333
- const parsed = await wrapAs7(
1590
+ const parsed = await wrapAs8(
1334
1591
  "RPC",
1335
1592
  OP_WITHDRAWALS.finalize.fetchParams.receipt,
1336
1593
  () => client.zks.getReceiptWithL2ToL1(l2TxHash),
@@ -1347,7 +1604,7 @@ function createFinalizationServices(client) {
1347
1604
  context: { l2TxHash }
1348
1605
  });
1349
1606
  }
1350
- const ev = await wrapAs7(
1607
+ const ev = await wrapAs8(
1351
1608
  "INTERNAL",
1352
1609
  OP_WITHDRAWALS.finalize.fetchParams.findMessage,
1353
1610
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
@@ -1357,7 +1614,7 @@ function createFinalizationServices(client) {
1357
1614
  message: "Failed to locate L1MessageSent event in L2 receipt."
1358
1615
  }
1359
1616
  );
1360
- const message = await wrapAs7(
1617
+ const message = await wrapAs8(
1361
1618
  "INTERNAL",
1362
1619
  OP_WITHDRAWALS.finalize.fetchParams.decodeMessage,
1363
1620
  () => Promise.resolve(AbiCoder.defaultAbiCoder().decode(["bytes"], ev.data)[0]),
@@ -1366,7 +1623,7 @@ function createFinalizationServices(client) {
1366
1623
  message: "Failed to decode withdrawal message."
1367
1624
  }
1368
1625
  );
1369
- const raw = await wrapAs7(
1626
+ const raw = await wrapAs8(
1370
1627
  "RPC",
1371
1628
  OP_WITHDRAWALS.finalize.fetchParams.rawReceipt,
1372
1629
  () => client.zks.getReceiptWithL2ToL1(l2TxHash),
@@ -1383,7 +1640,7 @@ function createFinalizationServices(client) {
1383
1640
  context: { l2TxHash }
1384
1641
  });
1385
1642
  }
1386
- const idx = await wrapAs7(
1643
+ const idx = await wrapAs8(
1387
1644
  "INTERNAL",
1388
1645
  OP_WITHDRAWALS.finalize.fetchParams.messengerIndex,
1389
1646
  () => Promise.resolve(messengerLogIndex(raw, { index: 0, messenger: L1_MESSENGER_ADDRESS })),
@@ -1392,7 +1649,7 @@ function createFinalizationServices(client) {
1392
1649
  message: "Failed to derive messenger log index."
1393
1650
  }
1394
1651
  );
1395
- const proof = await wrapAs7(
1652
+ const proof = await wrapAs8(
1396
1653
  "RPC",
1397
1654
  OP_WITHDRAWALS.finalize.fetchParams.proof,
1398
1655
  () => client.zks.getL2ToL1LogProof(l2TxHash, idx),
@@ -1401,7 +1658,7 @@ function createFinalizationServices(client) {
1401
1658
  message: "Failed to fetch L2\u2192L1 log proof."
1402
1659
  }
1403
1660
  );
1404
- const { chainId } = await wrapAs7(
1661
+ const { chainId } = await wrapAs8(
1405
1662
  "RPC",
1406
1663
  OP_WITHDRAWALS.finalize.fetchParams.network,
1407
1664
  () => l2.getNetwork(),
@@ -1420,7 +1677,7 @@ function createFinalizationServices(client) {
1420
1677
  message,
1421
1678
  merkleProof: proof.proof
1422
1679
  };
1423
- const { l1Nullifier } = await wrapAs7(
1680
+ const { l1Nullifier } = await wrapAs8(
1424
1681
  "INTERNAL",
1425
1682
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
1426
1683
  () => client.ensureAddresses(),
@@ -1432,7 +1689,7 @@ function createFinalizationServices(client) {
1432
1689
  return { params, nullifier: l1Nullifier };
1433
1690
  },
1434
1691
  async simulateFinalizeReadiness(params) {
1435
- const { l1Nullifier } = await wrapAs7(
1692
+ const { l1Nullifier } = await wrapAs8(
1436
1693
  "INTERNAL",
1437
1694
  OP_WITHDRAWALS.finalize.readiness.ensureAddresses,
1438
1695
  () => client.ensureAddresses(),
@@ -1444,7 +1701,7 @@ function createFinalizationServices(client) {
1444
1701
  const done = await (async () => {
1445
1702
  try {
1446
1703
  const cMini = new Contract(l1Nullifier, IL1NullifierMini, l1);
1447
- const isFinalized = await wrapAs7(
1704
+ const isFinalized = await wrapAs8(
1448
1705
  "RPC",
1449
1706
  OP_WITHDRAWALS.finalize.readiness.isFinalized,
1450
1707
  () => cMini.isWithdrawalFinalized(
@@ -1472,7 +1729,7 @@ function createFinalizationServices(client) {
1472
1729
  }
1473
1730
  },
1474
1731
  async isWithdrawalFinalized(key) {
1475
- const { l1Nullifier } = await wrapAs7(
1732
+ const { l1Nullifier } = await wrapAs8(
1476
1733
  "INTERNAL",
1477
1734
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
1478
1735
  () => client.ensureAddresses(),
@@ -1482,7 +1739,7 @@ function createFinalizationServices(client) {
1482
1739
  }
1483
1740
  );
1484
1741
  const c = new Contract(l1Nullifier, IL1NullifierMini, l1);
1485
- return await wrapAs7(
1742
+ return await wrapAs8(
1486
1743
  "RPC",
1487
1744
  OP_WITHDRAWALS.finalize.isFinalized,
1488
1745
  () => c.isWithdrawalFinalized(key.chainIdL2, key.l2BatchNumber, key.l2MessageIndex),
@@ -1493,7 +1750,7 @@ function createFinalizationServices(client) {
1493
1750
  );
1494
1751
  },
1495
1752
  async estimateFinalization(params) {
1496
- const { l1Nullifier } = await wrapAs7(
1753
+ const { l1Nullifier } = await wrapAs8(
1497
1754
  "INTERNAL",
1498
1755
  OP_WITHDRAWALS.finalize.estimate,
1499
1756
  () => client.ensureAddresses(),
@@ -1504,7 +1761,7 @@ function createFinalizationServices(client) {
1504
1761
  );
1505
1762
  const signer2 = client.getL1Signer();
1506
1763
  const c = new Contract(l1Nullifier, IL1Nullifier_default, signer2);
1507
- const gasLimit = await wrapAs7(
1764
+ const gasLimit = await wrapAs8(
1508
1765
  "RPC",
1509
1766
  OP_WITHDRAWALS.finalize.estimate,
1510
1767
  () => c.finalizeDeposit.estimateGas(params),
@@ -1519,7 +1776,7 @@ function createFinalizationServices(client) {
1519
1776
  message: "Failed to estimate gas for finalizeDeposit."
1520
1777
  }
1521
1778
  );
1522
- const feeData = await wrapAs7("RPC", OP_WITHDRAWALS.finalize.estimate, () => l1.getFeeData(), {
1779
+ const feeData = await wrapAs8("RPC", OP_WITHDRAWALS.finalize.estimate, () => l1.getFeeData(), {
1523
1780
  ctx: { where: "l1.getFeeData" },
1524
1781
  message: "Failed to estimate fee data for finalizeDeposit."
1525
1782
  });
@@ -1540,7 +1797,7 @@ function createFinalizationServices(client) {
1540
1797
  };
1541
1798
  },
1542
1799
  async finalizeDeposit(params) {
1543
- const { l1Nullifier } = await wrapAs7(
1800
+ const { l1Nullifier } = await wrapAs8(
1544
1801
  "INTERNAL",
1545
1802
  OP_WITHDRAWALS.finalize.fetchParams.ensureAddresses,
1546
1803
  () => client.ensureAddresses(),
@@ -1601,11 +1858,13 @@ var ROUTES2 = {
1601
1858
  "erc20-nonbase": routeErc20NonBase2()
1602
1859
  // AssetRouter.withdraw for non-base ERC-20s
1603
1860
  };
1604
- function createWithdrawalsResource(client) {
1861
+ function createWithdrawalsResource(client, tokens, contracts) {
1605
1862
  const svc = createFinalizationServices(client);
1606
1863
  const { wrap: wrap2, toResult: toResult2 } = createErrorHandlers("withdrawals");
1864
+ const tokensResource = tokens ?? createTokensResource(client);
1865
+ const contractsResource = contracts ?? createContractsResource(client);
1607
1866
  async function buildPlan(p) {
1608
- const ctx = await commonCtx2(p, client);
1867
+ const ctx = await commonCtx2(p, client, tokensResource, contractsResource);
1609
1868
  await ROUTES2[ctx.route].preflight?.(p, ctx);
1610
1869
  const { steps, approvals, fees } = await ROUTES2[ctx.route].build(p, ctx);
1611
1870
  return {
@@ -1929,58 +2188,14 @@ function createWithdrawalsResource(client) {
1929
2188
 
1930
2189
  // src/adapters/ethers/sdk.ts
1931
2190
  function createEthersSdk(client) {
2191
+ const tokens = createTokensResource(client);
2192
+ const contracts = createContractsResource(client);
1932
2193
  return {
1933
- deposits: createDepositsResource(client),
1934
- withdrawals: createWithdrawalsResource(client),
1935
- // TODO: might update to create dedicated resources for these
1936
- helpers: {
1937
- addresses: () => client.ensureAddresses(),
1938
- contracts: () => client.contracts(),
1939
- async l1AssetRouter() {
1940
- const { l1AssetRouter } = await client.contracts();
1941
- return l1AssetRouter;
1942
- },
1943
- async l1NativeTokenVault() {
1944
- const { l1NativeTokenVault } = await client.contracts();
1945
- return l1NativeTokenVault;
1946
- },
1947
- async l1Nullifier() {
1948
- const { l1Nullifier } = await client.contracts();
1949
- return l1Nullifier;
1950
- },
1951
- async baseToken(chainId) {
1952
- const id = chainId ?? BigInt((await client.l2.getNetwork()).chainId);
1953
- return client.baseToken(id);
1954
- },
1955
- async l2TokenAddress(l1Token) {
1956
- if (isAddressEq(l1Token, FORMAL_ETH_ADDRESS)) {
1957
- return ETH_ADDRESS;
1958
- }
1959
- const { chainId } = await client.l2.getNetwork();
1960
- const base = await client.baseToken(BigInt(chainId));
1961
- if (isAddressEq(l1Token, base)) {
1962
- return L2_BASE_TOKEN_ADDRESS;
1963
- }
1964
- const { l2NativeTokenVault } = await client.contracts();
1965
- const addr = await l2NativeTokenVault.l2TokenAddress(l1Token);
1966
- return addr;
1967
- },
1968
- async l1TokenAddress(l2Token) {
1969
- if (isAddressEq(l2Token, ETH_ADDRESS)) {
1970
- return ETH_ADDRESS;
1971
- }
1972
- const { l2AssetRouter } = await client.contracts();
1973
- const addr = await l2AssetRouter.l1TokenAddress(l2Token);
1974
- return addr;
1975
- },
1976
- async assetId(l1Token) {
1977
- const norm = isAddressEq(l1Token, FORMAL_ETH_ADDRESS) ? ETH_ADDRESS : l1Token;
1978
- const { l1NativeTokenVault } = await client.contracts();
1979
- const id = await l1NativeTokenVault.assetId(norm);
1980
- return id;
1981
- }
1982
- }
2194
+ deposits: createDepositsResource(client, tokens, contracts),
2195
+ withdrawals: createWithdrawalsResource(client, tokens, contracts),
2196
+ tokens,
2197
+ contracts
1983
2198
  };
1984
2199
  }
1985
2200
 
1986
- export { buildDirectRequestStruct, createDepositsResource, createEthersSdk, createFinalizationServices, createWithdrawalsResource, encodeNTVAssetId, encodeNTVTransferData, encodeNativeTokenVaultAssetId, encodeNativeTokenVaultTransferData, encodeSecondBridgeArgs, encodeSecondBridgeDataV1, encodeSecondBridgeErc20Args, encodeSecondBridgeEthArgs };
2201
+ export { buildDirectRequestStruct, createDepositsResource, createEthersSdk, createFinalizationServices, createTokensResource, createWithdrawalsResource, encodeNativeTokenVaultTransferData, encodeSecondBridgeArgs, encodeSecondBridgeDataV1, encodeSecondBridgeErc20Args, encodeSecondBridgeEthArgs };