ETH 和 ERC20 代币跨链桥

从 L1 存款 ETH 和 ERC20 代币

Gateway Router 合约允许 ETH 和 ERC20 代币分别使用 depositETHdepositERC20 方法从 L1 桥接到 L2。Gateway Router 合约是部署在 L1 上的无需许可的跨链桥。请注意,ERC20 代币在 L2 上将具有不同的地址,您可以使用该 getL2ERC20Address 函数查询新地址。

桥接ERC20代币时,你不必担心如何选择正确的网关。这是因为 L1GatewayRouter 将选择正确的入口来发送消息:

  • L1StandardERC20Gateway: 此网关允许人任意 ERC20 存款,并且被 L1GatewayRouter 选作不需要在 L2 上自定义逻辑的 ERC20 代币的默认网关。在第一次代币桥接时,将在L2上创建一个实现了 ScrollStandardERC20 的新代币。要桥接代币,请调用 L1GatewayRouter 上的 depositERC20 方案。
  • L1CustomERC20Gateway: 此网关将被 L1GatewayRouter 选作需要在 L2 上自定义逻辑的 ERC20 代币. 要使 L1/L2 代币对在Scroll自定义的 ERC20 跨链桥上工作,L2 代币合约必须实现 IScrollStandardERC20。此外,代币应包含对 L2CustomERC20Gatewaymintburn 功能。请访问 通过自定义网关桥接 ERC20 指南,获取有关如何桥接自定义代币的分步示例。

所有网关合约都将形成消息,并将其发送到可以向L2发送任意消息的网关合约 L1ScrollMessengerL1ScrollMessenger 合约将消息传递给 L1MessageQueue .任何用户都可以将消息直接发送到Message 合约,以在L2上执行任意数据。这意味着他们可以通过跨链桥从 L1 上的交易在 L2 上执行任何方法。尽管应用程序可以直接将消息传递到现有代币合约,但网关抽象了细节并简化了传输和调用过程。

当在 L1 上创建新区块时,观察器(Watcher)将检测到 L1MessageQueue 的消息并将其传递给中继器(Relayer)服务,后者将通过 l2geth 节点将交易提交到 L2。最后,l2geth节点将交易传递给 L2ScrollMessagner 合约,以便在L2上执行。

从 L2 提款 ETH 和 ERC20 代币

L2 Gateway合约与 L1 Gateway合约非常类似。我们可以使用 withdrawETHwithdrawERC20 方法将 ETH 和 ERC20 代币提取回 L1。合约地址部署在L2上。我们使用 getL1ERC20Address 来获取 L1 上的代币地址。

在 L2 上创建自定义逻辑的 ERC20 代币

如果代币需要 L2 上的自定义逻辑,则需要分别通过 L1CustomERC20GatewayL2CustomERC20Gateway 桥接。L2 上的自定义代币需要向 Gateway 合约授予权限,以便在存款发生时铸造新代币,并在代币提取时销毁

部署与 L2 L2CustomERC20Gateway 合约兼容的代币需要以下接口 IScrollStandardERC20

interface IScrollStandardERC20 {
/// @notice Return the address of Gateway the token belongs to.
function gateway() external view returns (address);
/// @notice Return the address of counterpart token.
function counterpart() external view returns (address);
/// @dev ERC677 Standard, see https://github.com/ethereum/EIPs/issues/677
/// Defi can use this method to transfer L1/L2 token to L2/L1,
/// and deposit to L2/L1 contract in one transaction
function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success);
/// @notice Mint some token to recipient's account.
/// @dev Gateway Utilities, only gateway contract can call
/// @param _to The address of recipient.
/// @param _amount The amount of token to mint.
function mint(address _to, uint256 _amount) external;
/// @notice Mint some token from account.
/// @dev Gateway Utilities, only gateway contract can call
/// @param _from The address of account to burn token.
/// @param _amount The amount of token to mint.
function burn(address _from, uint256 _amount) external;
}

将自定义的 L2 ERC20 代币添加到Scroll跨链桥

代币可以通过任何开发者部署的Gateway合约安全且无需许可地桥接。但是,Scroll还管理着 ERC20 Router 和 Gateway合约,欢迎社区创建的所有代币。成为 Scroll 托管网关的一部分意味着无需部署 Gateway 合约,代币将显示在 Scroll 前端中。要成为Scroll Gateway的一部分,您必须联系 Scroll 团队,将代币添加到 L1 和 L2 跨链桥合约中。为此,请按照代币列表 仓库内的说明将新代币添加到Scroll官方前端。

L1 Gateway API

请访问 npm 库 来获取完整的 Scroll 合约 API 文档。

depositETH

function depositETH(address _to, uint256 _amount, uint256 _gasLimit) public payable;

将 ETH 从 L1 发送至 L2.

参数描述
toL2 上收款人账户的地址
amount要转移的代币数量,以 wei 为单位。
gasLimit在L2上完成存款所需的gas上限。从4000到10000的gas上限应该足以处理交易。

depositERC20

function depositERC20(address _token, address _to, uint256 _amount, uint256 _gasLimit) payable;

将 ERC20代币 从 L1 发送至 L2.

参数描述
tokenL1 上的代币地址
toL2 上收款人账户的地址
amount要转移的代币数量,以 wei 为单位。
gasLimit在L2上完成存款所需的gas上限。从4000到10000的gas上限应该足以处理交易。

getL2ERC20Address

function getL2ERC20Address(address _l1Token) external view returns (address);

返回给定 L1 代币地址的相应 L2 代币地址。

参数描述
_l1TokenL1代币的地址

updateTokenMapping

function updateTokenMapping(address _l1Token, address _l2Token) external;

更新 ERC20 代币从 L1 到 L2 的映射。

参数描述
_l1TokenL1 中 ERC20 代币的地址
_l2TokenL2 中相应 ERC20 代币的地址

L2 Gateway API

withdrawETH

function withdrawETH(address to, uint256 amount, uint256 gasLimit) external payable;

将 ETH 从 L2 发送到 L1。

参数描述
toL1 上收款人账户的地址
amount要转移的代币数量,以 wei 为单位
gasLimit在L1上完成存款所需的gas上限。这是可选的,如果您不想设置它,请发送 0

withdrawERC20

function withdrawERC20(address token, address to, uint256 amount, uint256 gasLimit) external payable;

将 ERC20 代币从 L2 发送到 L1。

参数描述
tokenL2 上代币的地址
toL1 上收款人账户的地址
amount要转移的代币数量,以 wei 为单位
gasLimit在L1上完成存款所需的gas上限。这是可选的,如果您不想设置它,请发送 0

getL1ERC20Address

function getL1ERC20Address(address l2Token) external view returns (address);

返回给定 L2 代币地址的相应 L1 代币地址。

参数描述
l2TokenL2 上代币的地址

updateTokenMapping

function updateTokenMapping(address _l1Token, address _l2Token) external;

更新 ERC20 代币从 L2 到 L1 的映射。

参数描述
_l2TokenL2 中 ERC20 代币的地址
_l1TokenL1 中相应 ERC20 代币的地址

接下来是什么

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

资源

关注我们