@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.
- package/dist/adapters/ethers/client.cjs.map +1 -1
- package/dist/adapters/ethers/client.js +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 +4 -4
- 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 +4 -4
- 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-BCCKWWOX.js → chunk-5YWP4CZP.js} +373 -158
- package/dist/{chunk-OC6ZVLSP.js → chunk-JXUFGIJG.js} +348 -150
- package/dist/{chunk-QJS6ETEE.js → chunk-LL3WKCFJ.js} +15 -1
- 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
|
@@ -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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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 (
|
|
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: {
|
|
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
|
|
7189
|
+
} = await contracts.addresses();
|
|
6950
7190
|
const chainIdL2 = BigInt(await client.l2.getChainId());
|
|
6951
|
-
const
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
7985
|
-
|
|
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;
|