使用 OP Stack Client SDK
# 原生支持的链
OP Stack Client SDK (opens new window) 原生支持多个 OP 链:OP、Base 等。 要查看特定的 OP 链是否直接支持,请参阅文档 (opens new window)。
# 非原生支持的链
如果您正在使用一个非原生支持的链,例如您刚刚创建的 OP Stack 链(参见此处),您仍然可以使用OP Stack Client SDK (opens new window)。
您只需要向 CrossDomainMessenger
提供一些合约地址,因为它们没有预配置。
# 获取合约地址
# L1 合约地址
如果您按照入门指南中的说明操作,合约地址位于 .../optimism/packages/contracts-bedrock/deployments/getting-started
,这是您部署 L1 合约时创建的。
创建 CrossDomainMessenger 时的合约名称 | 包含地址的文件 |
---|---|
AddressManager | Lib_AddressManager.json |
L1CrossDomainMessenger | Proxy__OVM_L1CrossDomainMessenger.json |
L1StandardBridge | Proxy__OVM_L1StandardBridge.json |
OptimismPortal | OptimismPortalProxy.json |
L2OutputOracle | L2OutputOracleProxy.json |
# 不需要的合约地址
SDK 需要某些合约作为健全性检查,但实际上并不使用这些合约。 对于这些合约,您只需指定零地址:
StateCommitmentChain
CanonicalTransactionChain
BondManager
在 JavaScript 中,您可以使用表达式 "0x".padEnd(42, "0")
创建零地址。
# CrossChainMessenger 对象
这些步骤假设您在Hardhat 控制台 (opens new window)中。
它们进一步假设您的项目已经包含了 Optimism SDK @eth-optimism/sdk
(opens new window)。
导入 SDK
optimismSDK = require("@eth-optimism/sdk")
1设置配置参数。
变量名 值 l1Url
L1 的 RPC 提供程序的 URL,例如 https://eth-goerli.g.alchemy.com/v2/<api key>
l2Url
您的 OP Stack 的 URL。如果在同一台计算机上运行,则为 http://localhost:8545
privKey
在 L1 上有一些 ETH 的帐户的私钥 创建提供程序 (opens new window)和签名者 (opens new window)。
l1Provider = new ethers.providers.JsonRpcProvider(l1Url) l2Provider = new ethers.providers.JsonRpcProvider(l2Url) l1Signer = new ethers.Wallet(privKey).connect(l1Provider) l2Signer = new ethers.Wallet(privKey).connect(l2Provider)
1
2
3
4创建 L1 合约结构。
zeroAddr = "0x".padEnd(42, "0") l1Contracts = { StateCommitmentChain: zeroAddr, CanonicalTransactionChain: zeroAddr, BondManager: zeroAddr, // 这些合约具有您之前找到的地址。 AddressManager: "0x....", // Lib_AddressManager.json L1CrossDomainMessenger: "0x....", // Proxy__OVM_L1CrossDomainMessenger.json L1StandardBridge: "0x....", // Proxy__OVM_L1StandardBridge.json OptimismPortal: "0x....", // OptimismPortalProxy.json L2OutputOracle: "0x....", // L2OutputOracleProxy.json }
1
2
3
4
5
6
7
8
9
10
11
12创建标准桥接的数据结构。
bridges = { Standard: { l1Bridge: l1Contracts.L1StandardBridge, l2Bridge: "0x4200000000000000000000000000000000000010", Adapter: optimismSDK.StandardBridgeAdapter }, ETH: { l1Bridge: l1Contracts.L1StandardBridge, l2Bridge: "0x4200000000000000000000000000000000000010", Adapter: optimismSDK.ETHBridgeAdapter } }
1
2
3
4
5
6
7
8
9
10
11
12创建
CrossChainMessenger
(opens new window) 对象。crossChainMessenger = new optimismSDK.CrossChainMessenger({ bedrock: true, contracts: { l1: l1Contracts }, bridges: bridges, l1ChainId: await l1Signer.getChainId(), l2ChainId: await l2Signer.getChainId(), l1SignerOrProvider: l1Signer, l2SignerOrProvider: l2Signer, })
1
2
3
4
5
6
7
8
9
10
11
# 验证 SDK 功能
为了验证 SDK 的功能,将一些 ETH 从 L1 转移到 L2。
获取当前余额。
balances0 = [ await l1Provider.getBalance(l1Signer.address), await l2Provider.getBalance(l1Signer.address) ]
1
2
3
4转移 1 gwei。
tx = await crossChainMessenger.depositETH(1e9) rcpt = await tx.wait()
1
2获取转移后的余额。
balances1 = [ await l1Provider.getBalance(l1Signer.address), await l2Provider.getBalance(l1Signer.address) ]
1
2
3
4查看 L1 余额是否发生变化(可能远远超过 1 gwei,因为交易的成本)。
(balances0[0]-balances1[0])/1e9
1查看 L2 余额是否发生变化(可能需要几分钟)。
((await l2Provider.getBalance(l1Signer.address))-balances0[1])/1e9
1