Commit 97c2f807 authored by smartcontracts's avatar smartcontracts Committed by GitHub

Merge pull request #2081 from ethereum-optimism/sc/sdk-deposit-eth

feat(sdk): implement depositETH
parents 0cc660d3 b8226080
...@@ -44,7 +44,6 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -44,7 +44,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides?: L1ToL2Overrides overrides?: L1ToL2Overrides
): Promise<TransactionResponse> { ): Promise<TransactionResponse> {
const tx = await this.populateTransaction.sendMessage(message, overrides) const tx = await this.populateTransaction.sendMessage(message, overrides)
if (message.direction === MessageDirection.L1_TO_L2) { if (message.direction === MessageDirection.L1_TO_L2) {
return this.l1Signer.sendTransaction(tx) return this.l1Signer.sendTransaction(tx)
} else { } else {
...@@ -57,13 +56,13 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -57,13 +56,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit: NumberLike, messageGasLimit: NumberLike,
overrides?: Overrides overrides?: Overrides
): Promise<TransactionResponse> { ): Promise<TransactionResponse> {
const tx = await this.populateTransaction.resendMessage( return this.l1Signer.sendTransaction(
message, await this.populateTransaction.resendMessage(
messageGasLimit, message,
overrides messageGasLimit,
overrides
)
) )
return this.l1Signer.sendTransaction(tx)
} }
public async finalizeMessage( public async finalizeMessage(
...@@ -77,7 +76,9 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -77,7 +76,9 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: L1ToL2Overrides overrides?: L1ToL2Overrides
): Promise<TransactionResponse> { ): Promise<TransactionResponse> {
throw new Error('Not implemented') return this.l1Signer.sendTransaction(
await this.populateTransaction.depositETH(amount, overrides)
)
} }
public async withdrawETH( public async withdrawETH(
...@@ -148,7 +149,14 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -148,7 +149,14 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: L1ToL2Overrides overrides?: L1ToL2Overrides
): Promise<TransactionRequest> => { ): Promise<TransactionRequest> => {
throw new Error('Not implemented') return this.provider.contracts.l1.L1StandardBridge.populateTransaction.depositETH(
overrides?.l2GasLimit || 200000, // 200k gas is fine as a default
'0x', // No data
{
...omit(overrides || {}, 'l2GasLimit', 'value'),
value: amount,
}
)
}, },
withdrawETH: async ( withdrawETH: async (
...@@ -165,7 +173,6 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -165,7 +173,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides?: L1ToL2Overrides overrides?: L1ToL2Overrides
): Promise<BigNumber> => { ): Promise<BigNumber> => {
const tx = await this.populateTransaction.sendMessage(message, overrides) const tx = await this.populateTransaction.sendMessage(message, overrides)
if (message.direction === MessageDirection.L1_TO_L2) { if (message.direction === MessageDirection.L1_TO_L2) {
return this.provider.l1Provider.estimateGas(tx) return this.provider.l1Provider.estimateGas(tx)
} else { } else {
...@@ -183,7 +190,6 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -183,7 +190,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit, messageGasLimit,
overrides overrides
) )
return this.provider.l1Provider.estimateGas(tx) return this.provider.l1Provider.estimateGas(tx)
}, },
...@@ -198,7 +204,8 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -198,7 +204,8 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: L1ToL2Overrides overrides?: L1ToL2Overrides
): Promise<BigNumber> => { ): Promise<BigNumber> => {
throw new Error('Not implemented') const tx = await this.populateTransaction.depositETH(amount, overrides)
return this.provider.l1Provider.estimateGas(tx)
}, },
withdrawETH: async ( withdrawETH: async (
......
...@@ -3,6 +3,13 @@ pragma solidity ^0.8.9; ...@@ -3,6 +3,13 @@ pragma solidity ^0.8.9;
import { MockMessenger } from "./MockMessenger.sol"; import { MockMessenger } from "./MockMessenger.sol";
contract MockBridge { contract MockBridge {
event ETHDepositInitiated(
address indexed _from,
address indexed _to,
uint256 _amount,
bytes _data
);
event ERC20DepositInitiated( event ERC20DepositInitiated(
address indexed _l1Token, address indexed _l1Token,
address indexed _l2Token, address indexed _l2Token,
...@@ -110,4 +117,19 @@ contract MockBridge { ...@@ -110,4 +117,19 @@ contract MockBridge {
) public { ) public {
emit DepositFailed(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); emit DepositFailed(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data);
} }
function depositETH(
uint32 _l2GasLimit,
bytes memory _data
)
public
payable
{
emit ETHDepositInitiated(
msg.sender,
msg.sender,
msg.value,
_data
);
}
} }
...@@ -211,4 +211,48 @@ describe('CrossChainMessenger', () => { ...@@ -211,4 +211,48 @@ describe('CrossChainMessenger', () => {
it('should throw an error') it('should throw an error')
}) })
}) })
describe('depositETH', () => {
let l1Messenger: Contract
let l1Bridge: Contract
let provider: CrossChainProvider
let messenger: CrossChainMessenger
beforeEach(async () => {
l1Messenger = (await (
await ethers.getContractFactory('MockMessenger')
).deploy()) as any
l1Bridge = (await (
await ethers.getContractFactory('MockBridge')
).deploy(l1Messenger.address)) as any
provider = new CrossChainProvider({
l1Provider: ethers.provider,
l2Provider: ethers.provider,
l1ChainId: 31337,
contracts: {
l1: {
L1CrossDomainMessenger: l1Messenger.address,
L1StandardBridge: l1Bridge.address,
},
},
})
messenger = new CrossChainMessenger({
provider,
l1Signer,
l2Signer,
})
})
it('should trigger the deposit ETH function with the given amount', async () => {
await expect(messenger.depositETH(100000))
.to.emit(l1Bridge, 'ETHDepositInitiated')
.withArgs(
await l1Signer.getAddress(),
await l1Signer.getAddress(),
100000,
'0x'
)
})
})
}) })
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment