zksync-web3
Advanced tools
Comparing version 0.15.1 to 0.15.2
@@ -17,2 +17,3 @@ import { BigNumber, BigNumberish, BytesLike, ethers } from 'ethers'; | ||
erc20: import("../typechain").IL1Bridge; | ||
weth: import("../typechain").IL1Bridge; | ||
}>; | ||
@@ -140,2 +141,3 @@ getBalanceL1(token?: Address, blockTag?: ethers.providers.BlockTag): Promise<BigNumber>; | ||
erc20: import("../typechain").IL2Bridge; | ||
weth: import("../typechain").IL2Bridge; | ||
}>; | ||
@@ -142,0 +144,0 @@ _fillCustomData(data: Eip712Meta): Eip712Meta; |
@@ -25,3 +25,4 @@ "use strict"; | ||
return { | ||
erc20: typechain_1.IL1BridgeFactory.connect(addresses.erc20L1, this._signerL1()) | ||
erc20: typechain_1.IL1BridgeFactory.connect(addresses.erc20L1, this._signerL1()), | ||
weth: typechain_1.IL1BridgeFactory.connect(addresses.wethL1, this._signerL1()) | ||
}; | ||
@@ -40,4 +41,12 @@ } | ||
async getAllowanceL1(token, bridgeAddress, blockTag) { | ||
if (!bridgeAddress) { | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return allowance to its own bridge, otherwise to the default ERC20 bridge. | ||
bridgeAddress = | ||
l2WethToken != ethers_1.ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
} | ||
const erc20contract = typechain_1.IERC20MetadataFactory.connect(token, this._providerL1()); | ||
bridgeAddress !== null && bridgeAddress !== void 0 ? bridgeAddress : (bridgeAddress = (await this.getL1BridgeContracts()).erc20.address); | ||
return await erc20contract.allowance(await this.getAddress(), bridgeAddress, { blockTag }); | ||
@@ -49,6 +58,9 @@ } | ||
} | ||
else { | ||
const erc20Bridge = (await this.getL1BridgeContracts()).erc20; | ||
return await erc20Bridge.l2TokenAddress(token); | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L2 token address. | ||
if (l2WethToken != ethers_1.ethers.constants.AddressZero) { | ||
return l2WethToken; | ||
} | ||
return await bridgeContracts.erc20.l2TokenAddress(token); | ||
} | ||
@@ -62,3 +74,9 @@ async approveERC20(token, amount, overrides) { | ||
if (bridgeAddress == null) { | ||
bridgeAddress = (await this._providerL2().getDefaultBridgeAddresses()).erc20L1; | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return corresponding bridge, otherwise return default ERC20 bridge | ||
bridgeAddress = | ||
l2WethToken != ethers_1.ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
} | ||
@@ -93,5 +111,8 @@ else { | ||
if (transaction.approveERC20) { | ||
const bridgeAddress = transaction.bridgeAddress | ||
? transaction.bridgeAddress | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(transaction.token); | ||
// If the token is Wrapped Ether, use its bridge. | ||
const proposedBridge = l2WethToken != ethers_1.ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
const bridgeAddress = transaction.bridgeAddress ? transaction.bridgeAddress : proposedBridge; | ||
// We only request the allowance if the current one is not enough. | ||
@@ -136,5 +157,7 @@ const allowance = await this.getAllowanceL1(transaction.token, bridgeAddress); | ||
if (tx.bridgeAddress != null) { | ||
const customBridgeData = (_e = tx.customBridgeData) !== null && _e !== void 0 ? _e : (await (0, utils_1.getERC20DefaultBridgeData)(tx.token, this._providerL1())); | ||
let bridge = typechain_1.IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
let l2Address = await bridge.l2Bridge(); | ||
const customBridgeData = ((_e = tx.customBridgeData) !== null && _e !== void 0 ? _e : bridgeContracts.weth.address == tx.bridgeAddress) | ||
? '0x' | ||
: await (0, utils_1.getERC20DefaultBridgeData)(tx.token, this._providerL1()); | ||
const bridge = typechain_1.IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
const l2Address = await bridge.l2Bridge(); | ||
(_f = tx.l2GasLimit) !== null && _f !== void 0 ? _f : (tx.l2GasLimit = await (0, utils_1.estimateCustomBridgeDepositL2Gas)(this._providerL2(), tx.bridgeAddress, l2Address, tx.token, tx.amount, tx.to, customBridgeData, await this.getAddress(), tx.gasPerPubdataByte)); | ||
@@ -174,3 +197,5 @@ } | ||
await (0, utils_1.checkBaseCost)(baseCost, overrides.value); | ||
return await bridgeContracts.erc20.populateTransaction.deposit(...args, overrides); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(tx.token); | ||
const bridge = l2WethToken != ethers_1.ethers.constants.AddressZero ? bridgeContracts.weth : bridgeContracts.erc20; | ||
return await bridge.populateTransaction.deposit(...args, overrides); | ||
} | ||
@@ -193,3 +218,6 @@ } | ||
if (tx.bridgeAddress != null) { | ||
const customBridgeData = (_d = tx.customBridgeData) !== null && _d !== void 0 ? _d : (await (0, utils_1.getERC20DefaultBridgeData)(tx.token, this._providerL1())); | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const customBridgeData = ((_d = tx.customBridgeData) !== null && _d !== void 0 ? _d : bridgeContracts.weth.address == tx.bridgeAddress) | ||
? '0x' | ||
: await (0, utils_1.getERC20DefaultBridgeData)(tx.token, this._providerL1()); | ||
let bridge = typechain_1.IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
@@ -291,2 +319,9 @@ let l2Address = await bridge.l2Bridge(); | ||
if ((0, utils_1.isETH)(sender)) { | ||
const withdrawTo = ethers_1.ethers.utils.hexDataSlice(message, 4, 24); | ||
const l1Bridges = await this.getL1BridgeContracts(); | ||
// If the destination address matches the address of the L1 WETH contract, | ||
// the withdrawal request is processed through the WETH bridge. | ||
if (withdrawTo.toLowerCase() == l1Bridges.weth.address.toLowerCase()) { | ||
return await l1Bridges.weth.finalizeWithdrawal(l1BatchNumber, l2MessageIndex, l2TxNumberInBlock, message, proof, overrides !== null && overrides !== void 0 ? overrides : {}); | ||
} | ||
const contractAddress = await this._providerL2().getMainContractAddress(); | ||
@@ -388,3 +423,4 @@ const zksync = typechain_1.IZkSyncFactory.connect(contractAddress, this._signerL1()); | ||
return { | ||
erc20: typechain_1.IL2BridgeFactory.connect(addresses.erc20L2, this._signerL2()) | ||
erc20: typechain_1.IL2BridgeFactory.connect(addresses.erc20L2, this._signerL2()), | ||
weth: typechain_1.IL2BridgeFactory.connect(addresses.wethL2, this._signerL2()) | ||
}; | ||
@@ -391,0 +427,0 @@ } |
@@ -12,2 +12,4 @@ import { ethers, BigNumber, BigNumberish, utils, providers, BytesLike } from 'ethers'; | ||
erc20BridgeL2?: Address; | ||
wethBridgeL1?: Address; | ||
wethBridgeL2?: Address; | ||
}; | ||
@@ -36,2 +38,4 @@ getTransactionReceipt(transactionHash: string | Promise<string>): Promise<TransactionReceipt>; | ||
erc20L2: string; | ||
wethL1: string; | ||
wethL2: string; | ||
}>; | ||
@@ -38,0 +42,0 @@ getConfirmedTokens(start?: number, limit?: number): Promise<Token[]>; |
@@ -87,2 +87,3 @@ "use strict"; | ||
transactionHash: hash, | ||
txIndexInL1Batch: number, | ||
logIndex: number | ||
@@ -123,7 +124,11 @@ }; | ||
} | ||
else { | ||
const erc20BridgeAddress = (await this.getDefaultBridgeAddresses()).erc20L2; | ||
const erc20Bridge = typechain_1.IL2BridgeFactory.connect(erc20BridgeAddress, this); | ||
return await erc20Bridge.l2TokenAddress(token); | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = typechain_1.IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l2WethToken = await l2WethBridge.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L2 token address | ||
if (l2WethToken != ethers_1.ethers.constants.AddressZero) { | ||
return l2WethToken; | ||
} | ||
const l2Erc20Bridge = typechain_1.IL2BridgeFactory.connect(bridgeAddresses.erc20L2, this); | ||
return await l2Erc20Bridge.l2TokenAddress(token); | ||
} | ||
@@ -134,7 +139,11 @@ async l1TokenAddress(token) { | ||
} | ||
else { | ||
const erc20BridgeAddress = (await this.getDefaultBridgeAddresses()).erc20L2; | ||
const erc20Bridge = typechain_1.IL2BridgeFactory.connect(erc20BridgeAddress, this); | ||
return await erc20Bridge.l1TokenAddress(token); | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = typechain_1.IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l1WethToken = await l2WethBridge.l1TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L1 token address | ||
if (l1WethToken != ethers_1.ethers.constants.AddressZero) { | ||
return l1WethToken; | ||
} | ||
const erc20Bridge = typechain_1.IL2BridgeFactory.connect(bridgeAddresses.erc20L2, this); | ||
return await erc20Bridge.l1TokenAddress(token); | ||
} | ||
@@ -263,6 +272,10 @@ // This function is used when formatting requests for | ||
this.contractAddresses.erc20BridgeL2 = addresses.l2Erc20DefaultBridge; | ||
this.contractAddresses.wethBridgeL1 = addresses.l1WethBridge; | ||
this.contractAddresses.wethBridgeL2 = addresses.l2WethBridge; | ||
} | ||
return { | ||
erc20L1: this.contractAddresses.erc20BridgeL1, | ||
erc20L2: this.contractAddresses.erc20BridgeL2 | ||
erc20L2: this.contractAddresses.erc20BridgeL2, | ||
wethL1: this.contractAddresses.wethBridgeL1, | ||
wethL2: this.contractAddresses.wethBridgeL2 | ||
}; | ||
@@ -325,4 +338,7 @@ } | ||
if (tx.bridgeAddress == null) { | ||
const bridges = await this.getDefaultBridgeAddresses(); | ||
tx.bridgeAddress = bridges.erc20L2; | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = typechain_1.IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l1WethToken = await l2WethBridge.l1TokenAddress(tx.token); | ||
tx.bridgeAddress = | ||
l1WethToken != ethers_1.ethers.constants.AddressZero ? bridgeAddresses.wethL2 : bridgeAddresses.erc20L2; | ||
} | ||
@@ -329,0 +345,0 @@ const bridge = typechain_1.IL2BridgeFactory.connect(tx.bridgeAddress, this); |
@@ -41,2 +41,3 @@ import { ethers } from 'ethers'; | ||
erc20: import("../typechain").IL2Bridge; | ||
weth: import("../typechain").IL2Bridge; | ||
}>; | ||
@@ -80,2 +81,3 @@ _fillCustomData(data: import("./types").Eip712Meta): import("./types").Eip712Meta; | ||
erc20: import("../typechain").IL1Bridge; | ||
weth: import("../typechain").IL1Bridge; | ||
}>; | ||
@@ -211,2 +213,3 @@ getBalanceL1(token?: string, blockTag?: ethers.providers.BlockTag): Promise<ethers.BigNumber>; | ||
erc20: import("../typechain").IL2Bridge; | ||
weth: import("../typechain").IL2Bridge; | ||
}>; | ||
@@ -250,2 +253,3 @@ _fillCustomData(data: import("./types").Eip712Meta): import("./types").Eip712Meta; | ||
erc20: import("../typechain").IL1Bridge; | ||
weth: import("../typechain").IL1Bridge; | ||
}>; | ||
@@ -252,0 +256,0 @@ getBalanceL1(token?: string, blockTag?: ethers.providers.BlockTag): Promise<ethers.BigNumber>; |
@@ -88,2 +88,3 @@ import { BytesLike, BigNumberish, providers, BigNumber } from 'ethers'; | ||
transactionIndex: number; | ||
txIndexInL1Batch: number; | ||
shardId: number; | ||
@@ -174,2 +175,3 @@ isService: boolean; | ||
fee: BigNumberish; | ||
gasPerPubdata: BigNumberish; | ||
initiatorAddress: Address; | ||
@@ -176,0 +178,0 @@ receivedAt: Date; |
@@ -53,2 +53,2 @@ import { utils, ethers, BigNumber, BigNumberish, BytesLike } from 'ethers'; | ||
export declare function scaleGasLimit(gasLimit: BigNumber): BigNumber; | ||
export declare function estimateCustomBridgeDepositL2Gas(providerL2: Provider, l1BridgeAddress: Address, l2BridgeAddress: Address, token: Address, amount: BigNumberish, to: Address, bridgeData: BytesLike, from?: Address, gasPerPubdataByte?: BigNumberish): Promise<BigNumber>; | ||
export declare function estimateCustomBridgeDepositL2Gas(providerL2: Provider, l1BridgeAddress: Address, l2BridgeAddress: Address, token: Address, amount: BigNumberish, to: Address, bridgeData: BytesLike, from?: Address, gasPerPubdataByte?: BigNumberish, l2Value?: BigNumberish): Promise<BigNumber>; |
@@ -428,6 +428,19 @@ "use strict"; | ||
else { | ||
const l1ERC20BridgeAddresses = (await providerL2.getDefaultBridgeAddresses()).erc20L1; | ||
const erc20BridgeAddress = (await providerL2.getDefaultBridgeAddresses()).erc20L2; | ||
const bridgeData = await getERC20DefaultBridgeData(token, providerL1); | ||
return await estimateCustomBridgeDepositL2Gas(providerL2, l1ERC20BridgeAddresses, erc20BridgeAddress, token, amount, to, bridgeData, from, gasPerPubdataByte); | ||
let value, l1BridgeAddress, l2BridgeAddress, bridgeData; | ||
const bridgeAddresses = await providerL2.getDefaultBridgeAddresses(); | ||
const l1WethBridge = typechain_1.IL1BridgeFactory.connect(bridgeAddresses.wethL1, providerL1); | ||
const l2WethToken = await l1WethBridge.l2TokenAddress(token); | ||
if (l2WethToken != ethers_1.ethers.constants.AddressZero) { | ||
value = amount; | ||
l1BridgeAddress = bridgeAddresses.wethL1; | ||
l2BridgeAddress = bridgeAddresses.wethL2; | ||
bridgeData = '0x'; | ||
} | ||
else { | ||
value = 0; | ||
l1BridgeAddress = bridgeAddresses.erc20L1; | ||
l2BridgeAddress = bridgeAddresses.erc20L2; | ||
bridgeData = await getERC20DefaultBridgeData(token, providerL1); | ||
} | ||
return await estimateCustomBridgeDepositL2Gas(providerL2, l1BridgeAddress, l2BridgeAddress, token, amount, to, bridgeData, from, gasPerPubdataByte, value); | ||
} | ||
@@ -440,3 +453,3 @@ } | ||
exports.scaleGasLimit = scaleGasLimit; | ||
async function estimateCustomBridgeDepositL2Gas(providerL2, l1BridgeAddress, l2BridgeAddress, token, amount, to, bridgeData, from, gasPerPubdataByte) { | ||
async function estimateCustomBridgeDepositL2Gas(providerL2, l1BridgeAddress, l2BridgeAddress, token, amount, to, bridgeData, from, gasPerPubdataByte, l2Value) { | ||
const calldata = await getERC20BridgeCalldata(token, from, to, amount, bridgeData); | ||
@@ -446,6 +459,7 @@ return await providerL2.estimateL1ToL2Execute({ | ||
contractAddress: l2BridgeAddress, | ||
gasPerPubdataByte: gasPerPubdataByte, | ||
calldata: calldata | ||
gasPerPubdataByte, | ||
calldata, | ||
l2Value | ||
}); | ||
} | ||
exports.estimateCustomBridgeDepositL2Gas = estimateCustomBridgeDepositL2Gas; |
@@ -14,2 +14,3 @@ import { EIP712Signer } from './signer'; | ||
erc20: import("../typechain").IL2Bridge; | ||
weth: import("../typechain").IL2Bridge; | ||
}>; | ||
@@ -41,2 +42,3 @@ _fillCustomData(data: import("./types").Eip712Meta): import("./types").Eip712Meta; | ||
erc20: import("../typechain").IL1Bridge; | ||
weth: import("../typechain").IL1Bridge; | ||
}>; | ||
@@ -43,0 +45,0 @@ getBalanceL1(token?: string, blockTag?: ethers.providers.BlockTag): Promise<ethers.BigNumber>; |
# Changelog | ||
## [0.15.2](https://github.com/matter-labs/zksync-2-dev/compare/zksync-web3-v0.15.1...zksync-web3-v0.15.2) (2023-07-06) | ||
### Features | ||
* (DONT MERGE!) Integrate WETH bridge into server & SDK ([#1929](https://github.com/matter-labs/zksync-2-dev/issues/1929)) ([b3caf1e](https://github.com/matter-labs/zksync-2-dev/commit/b3caf1e35718c742e8d1d59427855df3b9109300)) | ||
* add tx_index_in_l1_batch field to L2ToL1Log ([#2032](https://github.com/matter-labs/zksync-2-dev/issues/2032)) ([3ce5779](https://github.com/matter-labs/zksync-2-dev/commit/3ce5779f500d5738c92e09eff13d553e20625055)) | ||
* **api:** add `gas_per_pubdata` to `zks_getTransactionDetails` ([#2085](https://github.com/matter-labs/zksync-2-dev/issues/2085)) ([dd91bb6](https://github.com/matter-labs/zksync-2-dev/commit/dd91bb673b29a17cea91e12ec95f53deba556798)) | ||
## [0.15.1](https://github.com/matter-labs/zksync-2-dev/compare/zksync-web3-v0.15.0...zksync-web3-v0.15.1) (2023-04-24) | ||
@@ -4,0 +13,0 @@ |
{ | ||
"name": "zksync-web3", | ||
"version": "0.15.1", | ||
"version": "0.15.2", | ||
"main": "build/src/index.js", | ||
@@ -5,0 +5,0 @@ "types": "build/src/index.d.ts", |
@@ -58,3 +58,4 @@ import { BigNumber, BigNumberish, BytesLike, ethers } from 'ethers'; | ||
return { | ||
erc20: IL1BridgeFactory.connect(addresses.erc20L1, this._signerL1()) | ||
erc20: IL1BridgeFactory.connect(addresses.erc20L1, this._signerL1()), | ||
weth: IL1BridgeFactory.connect(addresses.wethL1, this._signerL1()) | ||
}; | ||
@@ -78,4 +79,13 @@ } | ||
): Promise<BigNumber> { | ||
if (!bridgeAddress) { | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return allowance to its own bridge, otherwise to the default ERC20 bridge. | ||
bridgeAddress = | ||
l2WethToken != ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
} | ||
const erc20contract = IERC20MetadataFactory.connect(token, this._providerL1()); | ||
bridgeAddress ??= (await this.getL1BridgeContracts()).erc20.address; | ||
return await erc20contract.allowance(await this.getAddress(), bridgeAddress, { blockTag }); | ||
@@ -87,6 +97,12 @@ } | ||
return ETH_ADDRESS; | ||
} else { | ||
const erc20Bridge = (await this.getL1BridgeContracts()).erc20; | ||
return await erc20Bridge.l2TokenAddress(token); | ||
} | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L2 token address. | ||
if (l2WethToken != ethers.constants.AddressZero) { | ||
return l2WethToken; | ||
} | ||
return await bridgeContracts.erc20.l2TokenAddress(token); | ||
} | ||
@@ -107,3 +123,9 @@ | ||
if (bridgeAddress == null) { | ||
bridgeAddress = (await this._providerL2().getDefaultBridgeAddresses()).erc20L1; | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return corresponding bridge, otherwise return default ERC20 bridge | ||
bridgeAddress = | ||
l2WethToken != ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
} else { | ||
@@ -164,5 +186,9 @@ delete overrides.bridgeAddress; | ||
if (transaction.approveERC20) { | ||
const bridgeAddress = transaction.bridgeAddress | ||
? transaction.bridgeAddress | ||
: bridgeContracts.erc20.address; | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(transaction.token); | ||
// If the token is Wrapped Ether, use its bridge. | ||
const proposedBridge = | ||
l2WethToken != ethers.constants.AddressZero | ||
? bridgeContracts.weth.address | ||
: bridgeContracts.erc20.address; | ||
const bridgeAddress = transaction.bridgeAddress ? transaction.bridgeAddress : proposedBridge; | ||
@@ -239,5 +265,7 @@ // We only request the allowance if the current one is not enough. | ||
const customBridgeData = | ||
tx.customBridgeData ?? (await getERC20DefaultBridgeData(tx.token, this._providerL1())); | ||
let bridge = IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
let l2Address = await bridge.l2Bridge(); | ||
tx.customBridgeData ?? bridgeContracts.weth.address == tx.bridgeAddress | ||
? '0x' | ||
: await getERC20DefaultBridgeData(tx.token, this._providerL1()); | ||
const bridge = IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
const l2Address = await bridge.l2Bridge(); | ||
tx.l2GasLimit ??= await estimateCustomBridgeDepositL2Gas( | ||
@@ -305,3 +333,6 @@ this._providerL2(), | ||
return await bridgeContracts.erc20.populateTransaction.deposit(...args, overrides); | ||
const l2WethToken = await bridgeContracts.weth.l2TokenAddress(tx.token); | ||
const bridge = | ||
l2WethToken != ethers.constants.AddressZero ? bridgeContracts.weth : bridgeContracts.erc20; | ||
return await bridge.populateTransaction.deposit(...args, overrides); | ||
} | ||
@@ -335,4 +366,7 @@ } | ||
if (tx.bridgeAddress != null) { | ||
const bridgeContracts = await this.getL1BridgeContracts(); | ||
const customBridgeData = | ||
tx.customBridgeData ?? (await getERC20DefaultBridgeData(tx.token, this._providerL1())); | ||
tx.customBridgeData ?? bridgeContracts.weth.address == tx.bridgeAddress | ||
? '0x' | ||
: await getERC20DefaultBridgeData(tx.token, this._providerL1()); | ||
let bridge = IL1BridgeFactory.connect(tx.bridgeAddress, this._signerL1()); | ||
@@ -480,2 +514,17 @@ let l2Address = await bridge.l2Bridge(); | ||
if (isETH(sender)) { | ||
const withdrawTo = ethers.utils.hexDataSlice(message, 4, 24); | ||
const l1Bridges = await this.getL1BridgeContracts(); | ||
// If the destination address matches the address of the L1 WETH contract, | ||
// the withdrawal request is processed through the WETH bridge. | ||
if (withdrawTo.toLowerCase() == l1Bridges.weth.address.toLowerCase()) { | ||
return await l1Bridges.weth.finalizeWithdrawal( | ||
l1BatchNumber, | ||
l2MessageIndex, | ||
l2TxNumberInBlock, | ||
message, | ||
proof, | ||
overrides ?? {} | ||
); | ||
} | ||
const contractAddress = await this._providerL2().getMainContractAddress(); | ||
@@ -678,3 +727,4 @@ const zksync = IZkSyncFactory.connect(contractAddress, this._signerL1()); | ||
return { | ||
erc20: IL2BridgeFactory.connect(addresses.erc20L2, this._signerL2()) | ||
erc20: IL2BridgeFactory.connect(addresses.erc20L2, this._signerL2()), | ||
weth: IL2BridgeFactory.connect(addresses.wethL2, this._signerL2()) | ||
}; | ||
@@ -681,0 +731,0 @@ } |
@@ -47,2 +47,4 @@ import { ethers, BigNumber, BigNumberish, utils, providers, BytesLike, Contract } from 'ethers'; | ||
erc20BridgeL2?: Address; | ||
wethBridgeL1?: Address; | ||
wethBridgeL2?: Address; | ||
}; | ||
@@ -139,2 +141,3 @@ | ||
transactionHash: hash, | ||
txIndexInL1Batch: number, | ||
logIndex: number | ||
@@ -179,7 +182,14 @@ }; | ||
return ETH_ADDRESS; | ||
} else { | ||
const erc20BridgeAddress = (await this.getDefaultBridgeAddresses()).erc20L2; | ||
const erc20Bridge = IL2BridgeFactory.connect(erc20BridgeAddress, this); | ||
return await erc20Bridge.l2TokenAddress(token); | ||
} | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l2WethToken = await l2WethBridge.l2TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L2 token address | ||
if (l2WethToken != ethers.constants.AddressZero) { | ||
return l2WethToken; | ||
} | ||
const l2Erc20Bridge = IL2BridgeFactory.connect(bridgeAddresses.erc20L2, this); | ||
return await l2Erc20Bridge.l2TokenAddress(token); | ||
} | ||
@@ -190,7 +200,14 @@ | ||
return ETH_ADDRESS; | ||
} else { | ||
const erc20BridgeAddress = (await this.getDefaultBridgeAddresses()).erc20L2; | ||
const erc20Bridge = IL2BridgeFactory.connect(erc20BridgeAddress, this); | ||
return await erc20Bridge.l1TokenAddress(token); | ||
} | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l1WethToken = await l2WethBridge.l1TokenAddress(token); | ||
// If the token is Wrapped Ether, return its L1 token address | ||
if (l1WethToken != ethers.constants.AddressZero) { | ||
return l1WethToken; | ||
} | ||
const erc20Bridge = IL2BridgeFactory.connect(bridgeAddresses.erc20L2, this); | ||
return await erc20Bridge.l1TokenAddress(token); | ||
} | ||
@@ -337,6 +354,10 @@ | ||
this.contractAddresses.erc20BridgeL2 = addresses.l2Erc20DefaultBridge; | ||
this.contractAddresses.wethBridgeL1 = addresses.l1WethBridge; | ||
this.contractAddresses.wethBridgeL2 = addresses.l2WethBridge; | ||
} | ||
return { | ||
erc20L1: this.contractAddresses.erc20BridgeL1, | ||
erc20L2: this.contractAddresses.erc20BridgeL2 | ||
erc20L2: this.contractAddresses.erc20BridgeL2, | ||
wethL1: this.contractAddresses.wethBridgeL1, | ||
wethL2: this.contractAddresses.wethBridgeL2 | ||
}; | ||
@@ -420,4 +441,8 @@ } | ||
if (tx.bridgeAddress == null) { | ||
const bridges = await this.getDefaultBridgeAddresses(); | ||
tx.bridgeAddress = bridges.erc20L2; | ||
const bridgeAddresses = await this.getDefaultBridgeAddresses(); | ||
const l2WethBridge = IL2BridgeFactory.connect(bridgeAddresses.wethL2, this); | ||
const l1WethToken = await l2WethBridge.l1TokenAddress(tx.token); | ||
tx.bridgeAddress = | ||
l1WethToken != ethers.constants.AddressZero ? bridgeAddresses.wethL2 : bridgeAddresses.erc20L2; | ||
} | ||
@@ -424,0 +449,0 @@ |
@@ -118,2 +118,3 @@ import { BytesLike, BigNumberish, providers, BigNumber } from 'ethers'; | ||
transactionIndex: number; | ||
txIndexInL1Batch: number; | ||
shardId: number; | ||
@@ -216,2 +217,3 @@ isService: boolean; | ||
fee: BigNumberish; | ||
gasPerPubdata: BigNumberish; | ||
initiatorAddress: Address; | ||
@@ -218,0 +220,0 @@ receivedAt: Date; |
@@ -15,3 +15,3 @@ import { utils, ethers, BigNumber, BigNumberish, BytesLike } from 'ethers'; | ||
import { EIP712Signer } from './signer'; | ||
import { IERC20MetadataFactory } from '../typechain'; | ||
import { IERC20MetadataFactory, IL1BridgeFactory } from '../typechain'; | ||
import { AbiCoder } from 'ethers/lib/utils'; | ||
@@ -536,9 +536,22 @@ | ||
} else { | ||
const l1ERC20BridgeAddresses = (await providerL2.getDefaultBridgeAddresses()).erc20L1; | ||
const erc20BridgeAddress = (await providerL2.getDefaultBridgeAddresses()).erc20L2; | ||
const bridgeData = await getERC20DefaultBridgeData(token, providerL1); | ||
let value, l1BridgeAddress, l2BridgeAddress, bridgeData; | ||
const bridgeAddresses = await providerL2.getDefaultBridgeAddresses(); | ||
const l1WethBridge = IL1BridgeFactory.connect(bridgeAddresses.wethL1, providerL1); | ||
const l2WethToken = await l1WethBridge.l2TokenAddress(token); | ||
if (l2WethToken != ethers.constants.AddressZero) { | ||
value = amount; | ||
l1BridgeAddress = bridgeAddresses.wethL1; | ||
l2BridgeAddress = bridgeAddresses.wethL2; | ||
bridgeData = '0x'; | ||
} else { | ||
value = 0; | ||
l1BridgeAddress = bridgeAddresses.erc20L1; | ||
l2BridgeAddress = bridgeAddresses.erc20L2; | ||
bridgeData = await getERC20DefaultBridgeData(token, providerL1); | ||
} | ||
return await estimateCustomBridgeDepositL2Gas( | ||
providerL2, | ||
l1ERC20BridgeAddresses, | ||
erc20BridgeAddress, | ||
l1BridgeAddress, | ||
l2BridgeAddress, | ||
token, | ||
@@ -549,3 +562,4 @@ amount, | ||
from, | ||
gasPerPubdataByte | ||
gasPerPubdataByte, | ||
value | ||
); | ||
@@ -568,3 +582,4 @@ } | ||
from?: Address, | ||
gasPerPubdataByte?: BigNumberish | ||
gasPerPubdataByte?: BigNumberish, | ||
l2Value?: BigNumberish | ||
): Promise<BigNumber> { | ||
@@ -575,5 +590,6 @@ const calldata = await getERC20BridgeCalldata(token, from, to, amount, bridgeData); | ||
contractAddress: l2BridgeAddress, | ||
gasPerPubdataByte: gasPerPubdataByte, | ||
calldata: calldata | ||
gasPerPubdataByte, | ||
calldata, | ||
l2Value | ||
}); | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
912901
28459