@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.
- package/README.md +1 -3
- package/dist/adapters/ethers/client.cjs.map +1 -1
- package/dist/adapters/ethers/index.cjs +391 -170
- package/dist/adapters/ethers/index.cjs.map +1 -1
- package/dist/adapters/ethers/index.d.ts +1 -0
- package/dist/adapters/ethers/index.js +3 -3
- package/dist/adapters/ethers/resources/contracts/contracts.d.ts +9 -0
- package/dist/adapters/ethers/resources/contracts/index.d.ts +2 -0
- package/dist/adapters/ethers/resources/contracts/types.d.ts +60 -0
- package/dist/adapters/ethers/resources/deposits/context.d.ts +16 -2
- package/dist/adapters/ethers/resources/deposits/index.d.ts +3 -1
- package/dist/adapters/ethers/resources/deposits/services/gas.d.ts +3 -2
- package/dist/adapters/ethers/resources/tokens/index.d.ts +1 -0
- package/dist/adapters/ethers/resources/tokens/tokens.d.ts +10 -0
- package/dist/adapters/ethers/resources/utils.d.ts +0 -3
- package/dist/adapters/ethers/resources/withdrawals/context.d.ts +11 -3
- package/dist/adapters/ethers/resources/withdrawals/index.d.ts +3 -1
- package/dist/adapters/ethers/sdk.cjs +386 -154
- package/dist/adapters/ethers/sdk.cjs.map +1 -1
- package/dist/adapters/ethers/sdk.d.ts +5 -22
- package/dist/adapters/ethers/sdk.js +3 -3
- package/dist/adapters/viem/client.cjs.map +1 -1
- package/dist/adapters/viem/index.cjs +383 -176
- package/dist/adapters/viem/index.cjs.map +1 -1
- package/dist/adapters/viem/index.d.ts +3 -0
- package/dist/adapters/viem/index.js +3 -3
- package/dist/adapters/viem/resources/contracts/contracts.d.ts +9 -0
- package/dist/adapters/viem/resources/contracts/index.d.ts +2 -0
- package/dist/adapters/viem/resources/contracts/types.d.ts +61 -0
- package/dist/adapters/viem/resources/deposits/context.d.ts +16 -2
- package/dist/adapters/viem/resources/deposits/index.d.ts +3 -1
- package/dist/adapters/viem/resources/deposits/services/gas.d.ts +2 -1
- package/dist/adapters/viem/resources/tokens/index.d.ts +1 -0
- package/dist/adapters/viem/resources/tokens/tokens.d.ts +3 -0
- package/dist/adapters/viem/resources/utils.d.ts +0 -3
- package/dist/adapters/viem/resources/withdrawals/context.d.ts +11 -3
- package/dist/adapters/viem/resources/withdrawals/index.d.ts +3 -1
- package/dist/adapters/viem/sdk.cjs +401 -189
- package/dist/adapters/viem/sdk.cjs.map +1 -1
- package/dist/adapters/viem/sdk.d.ts +5 -25
- package/dist/adapters/viem/sdk.js +3 -3
- package/dist/{chunk-OC6ZVLSP.js → chunk-JXUFGIJG.js} +348 -150
- package/dist/{chunk-QJS6ETEE.js → chunk-LL3WKCFJ.js} +15 -1
- package/dist/{chunk-BCCKWWOX.js → chunk-NBJEQAOE.js} +373 -158
- package/dist/{chunk-HLUANWGN.js → chunk-NEC2ZKHI.js} +4 -12
- package/dist/chunk-NTEIA5KA.js +13 -0
- package/dist/core/codec/ntv.d.ts +48 -0
- package/dist/core/index.cjs +4 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +2 -1
- package/dist/core/types/errors.d.ts +1 -1
- package/dist/core/types/flows/token.d.ts +192 -0
- package/dist/core/utils/addr.d.ts +2 -0
- package/dist/index.cjs +4 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/package.json +1 -1
- package/dist/adapters/ethers/resources/token-info.d.ts +0 -31
- 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-
|
|
3
|
-
import { findL1MessageSentLog, messengerLogIndex, isAddressEq,
|
|
4
|
-
import { OP_WITHDRAWALS, IL1Nullifier_default, createError, OP_DEPOSITS, IERC20_default, isZKsyncError, isReceiptNotFound
|
|
5
|
-
import { ETH_ADDRESS,
|
|
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
|
|
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
|
|
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
|
|
108
|
-
const data =
|
|
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 = (
|
|
218
|
-
return new Interface(
|
|
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
|
|
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 =
|
|
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
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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: {
|
|
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 =
|
|
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
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
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
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
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
|
|
1376
|
+
} = await contracts.addresses();
|
|
1132
1377
|
const { chainId } = await client.l2.getNetwork();
|
|
1133
1378
|
const chainIdL2 = BigInt(chainId);
|
|
1134
|
-
const
|
|
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:
|
|
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 =
|
|
1186
|
-
const data = await
|
|
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:
|
|
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
|
|
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
|
|
1270
|
-
const assetId = await
|
|
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
|
-
() =>
|
|
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
|
|
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 =
|
|
1291
|
-
const dataWithdraw = await
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1936
|
-
|
|
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,
|
|
2201
|
+
export { buildDirectRequestStruct, createDepositsResource, createEthersSdk, createFinalizationServices, createTokensResource, createWithdrawalsResource, encodeNativeTokenVaultTransferData, encodeSecondBridgeArgs, encodeSecondBridgeDataV1, encodeSecondBridgeErc20Args, encodeSecondBridgeEthArgs };
|