提款网关

本文档介绍了用户和开发者如何使用网关将代币从 L2 提取至 L1。 我们在 L2 上为标准代币提供了多个网关,并提供了一个网关路由器,如下表所示。

网关合约描述
L2GatewayRouter支持ETH和ERC20代币提款的网关路由器
L2ETHGatewayETH 提款的网关
L2StandardERC20Gateway标准 ERC20 代币提款的网关
L2CustomERC20Gateway自定义 ERC20 代币提款的网关
L2WETHGatewayWETH 提款的网关
L2ERC721GatewayERC721 代币提款的网关
L2ERC1155GatewayERC1155 代币提款的网关

概览

Withdraw Workflow

上图描述了从 L2 提款至 L1 的工作流程。 用户调用网关来发起代币提款。 然后该笔提款将被编码为消息发送至 L2ScrollMessenger 合约,随后添加至 L2MessageQueueL2MessageQueue 维护了一个提款树,在每次添加新消息时更新根哈希。 提款树根会和 L2 状态树根在 L1 rollup 合约上最终确认。 在新的提款树根在 L1 上最终确认后,用户或者第三方可以构建有效的默克尔包含证明(Merkle Inclusion Proof),并在 L1 上发送 执行提款 交易来最终确认提款。 您可以在跨链消息传递中找到有关 L1 至 L2 消息中继工作流的更多详细信息。

后续部分将详细介绍如何对不同的代币进行提款。

提取 ETH

提取 ETH 的工作原理如下。

  1. L2GatewayRouter 合约提供了三个函数,将 ETH 从 L2 提取至 L1。其中 withdrawETHAndCall 函数可以同时提取 ETH 并执行合约调用。

    function withdrawETH(uint256 _amount, uint256 _gasLimit) external payable;
    function withdrawETH(address _to, uint256 _amount, uint256 _gasLimit) public payable;
    function withdrawETHAndCall(
    address _to,
    uint256 _amount,
    bytes calldata _data,
    uint256 _gasLimit
    ) external payable;
  2. withdrawETHAndCall 函数调用 L2ETHGateway 合约。L2ETHGateway 合约编码提款消息并将其与要提取的 ETH 发送至 L2ScrollMessenger 合约。

  3. 提取的 ETH 再一次被锁定在 L2ScrollMessenger 合约中。 L2ScrollMessenger 合约将将消息添加至 L2MessageQueue 合约中的消息队列中.

  4. L1 的提款执行交易调用 L1ScrollMessenger.relayMessageWithProof 函数来最终确认提款。在提取 ETH 的情况下, 该 relayMessageWithProof 函数会调用 L1ETHGateway.finalizeWithdrawETH, 将 ETH 发送回 L1 的收款方账户。

  5. 如果用户调用 L2 的 withdrawETHAndCallL1ETHGateway 合约的 finalizeWithdrawETH 函数会将附加数据转发至目标的 L1 合约。

提取 ERC20 代币

ERC20 代币提款的工作原理如下。

  1. 如下所示,要将 ERC20 代币从 L2 提取至 L1,用户可以使用 L2GatewayRouter.withdrawERC20L2GatewayRouter.withdrawERC20AndCall

    function withdrawERC20(address _token, uint256 _amount, uint256 _gasLimit) external payable;
    function withdrawERC20(address _token, address _to, uint256 _amount, uint256 _gasLimit) external payable;
    function withdrawERC20AndCall(
    address _token,
    address _to,
    uint256 _amount,
    bytes memory _data,
    uint256 _gasLimit
    ) public payable;
  2. 根据 ERC20 代币到网关的映射,L2GatewayRouter 合约调用对应的网关:L2StandardERC20GatewayL2CustomERC20Gateway 或是 L2WETHGateway。余下步骤将分别描述。

标准和自定义 ERC20 代币

如下所示,标准和自定义 ERC20 代币的提款原理一样。

  1. L2StandardERC20GatewayL2CustomERC20Gateway 合约销毁要提取的 ERC20 代币,将提款编码至消息并发送给 L2ScrollMessenger 合约。
  2. L1 的提款执行交易调用 L1ScrollMessenger.relayMessageWithProof 函数来最终确认提款。 在标准和自定义 ERC20 代币的提款情况下,交易分别调用 L1StandardERC20Gateway 或是 L1CustomERC20Gateway 合约的 finalizeWithdrawERC20 函数。
    • L1StandardERC20Gateway 合约中,如果这是 ERC20 代币的第一次提款,finalizeWithdrawERC20 函数会更新 tokenMapping 中的 L1 代币地址与 L2 代币地址的映射关系。
  3. L1 的 ERC20 代币网关将释放锁定的 ERC20 代币,从自己的地址转账至 L1 上的收款方地址。
  4. 如果用户在 L2 上调用 withdrawERC20AndCall函数,网关会用附加数据调用目标的 L1 合约。

WETH 代币

我们为 L2 上的 WETH 代币提供了一个自定义网关 L2WETHGateway,并将网关地址记录在 L2GatewayRouter 合约中。WETH 代币的提款工作原理如下。

  1. L2WETHGateway 合约将要提款的 WETH 代币转账至自己,并解包 WETH 为原生的 ETH 代币。ETH 代币随后发送回 L2ScrollMessenger 合约。
  2. L2WETHGateway 合约将编码代币提款消息并转发给 L2ScrollMessenger 合约。
  3. L1 的提款执行交易调用 L1ScrollMessenger.relayMessageWithProof 函数来在 L1 上最终确认提款。 在 WETH 代币提款的情况下,交易调用 L1WETHGateway.finalizeWithdrawERC20 并发送提取的 ETH 至 L1WETHGateway 合约。
  4. L1WETHGateway 合约再次包装提取的 ETH 为 L1 的 WETH 代币,并发送至 L1 的收款方地址。
  5. 如果用户在 L2 上调用 withdrawERC20AndCallL1WETHGateway 合约会用附加数据调用目标的 L1 合约。

提取 ERC-721 / ERC-1155 代币

The withdrawal of ERC-721 or ERC-1155 tokens works very similar to ERC20 tokens. One can use the gateway L2ERC721Gateway or L2ERC1155Gateway to withdraw ERC-721 /ERC-1155 tokens from L2.

function withdrawERC721(
address _token,
uint256 _tokenId,
uint256 _gasLimit
) external payable;
function withdrawERC721(
address _token,
address _to,
uint256 _tokenId,
uint256 _gasLimit
) external payable;
function withdrawERC1155(
address _token,
uint256 _tokenId,
uint256 _amount,
uint256 _gasLimit
) external payable;
function withdrawERC1155(
address _token,
address _to,
uint256 _tokenId,
uint256 _amount,
uint256 _gasLimit
) external payable;

为了方便大额的 ERC-721 或 ERC-1155 代币提款,我们也在 L2ERC721GatewayL2ERC1155Gateway 合约中提供通过如下函数,实现了批量提款功能:

function batchWithdrawERC721(
address _token,
uint256[] calldata _tokenIds,
uint256 _gasLimit
) external payable;
function batchWithdrawERC721(
address _token,
address _to,
uint256[] calldata _tokenIds,
uint256 _gasLimit
) external payable;
function batchWithdrawERC1155(
address _token,
uint256[] calldata _tokenIds,
uint256[] calldata _amounts,
uint256 _gasLimit
) external payable;
function batchWithdrawERC1155(
address _token,
address _to,
uint256[] calldata _tokenIds,
uint256[] calldata _amounts,
uint256 _gasLimit
) external payable;

ERC-721 或 ERC-1155 代币在 L1 上对应的合约是 L1ERC721GatewayL1ERC1155Gateway,用于在 L1 上最终确认提款。

接下来是什么

随时了解最新的 Scroll 新闻
路线图更新,虚拟和现场活动,生态机会等等
感谢您的订阅!

资源

关注我们