Commit 7d0f4976 authored by Kelvin Fichter's avatar Kelvin Fichter

feat(sdk): implement withdrawETH

This commit implements the SDK's withdrawETH function which allows users
to withdraw an amount of ETH (specified in wei) from L2 to L1.
parent 734e3ff8
...@@ -4,6 +4,7 @@ import { ...@@ -4,6 +4,7 @@ import {
TransactionRequest, TransactionRequest,
TransactionResponse, TransactionResponse,
} from '@ethersproject/abstract-provider' } from '@ethersproject/abstract-provider'
import { predeploys } from '@eth-optimism/contracts'
import { import {
CrossChainMessageRequest, CrossChainMessageRequest,
...@@ -85,7 +86,9 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -85,7 +86,9 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: Overrides overrides?: Overrides
): Promise<TransactionResponse> { ): Promise<TransactionResponse> {
throw new Error('Not implemented') return this.l2Signer.sendTransaction(
await this.populateTransaction.withdrawETH(amount, overrides)
)
} }
populateTransaction = { populateTransaction = {
...@@ -163,7 +166,13 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -163,7 +166,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: Overrides overrides?: Overrides
): Promise<TransactionRequest> => { ): Promise<TransactionRequest> => {
throw new Error('Not implemented') return this.provider.contracts.l2.L2StandardBridge.populateTransaction.withdraw(
predeploys.OVM_ETH,
amount,
0, // No need to supply gas here
'0x', // No data,
overrides || {}
)
}, },
} }
...@@ -212,7 +221,8 @@ export class CrossChainMessenger implements ICrossChainMessenger { ...@@ -212,7 +221,8 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike, amount: NumberLike,
overrides?: Overrides overrides?: Overrides
): Promise<BigNumber> => { ): Promise<BigNumber> => {
throw new Error('Not implemented') const tx = await this.populateTransaction.withdrawETH(amount, overrides)
return this.provider.l2Provider.estimateGas(tx)
}, },
} }
} }
...@@ -132,4 +132,23 @@ contract MockBridge { ...@@ -132,4 +132,23 @@ contract MockBridge {
_data _data
); );
} }
function withdraw(
address _l2Token,
uint256 _amount,
uint32 _l1Gas,
bytes calldata _data
)
public
payable
{
emit WithdrawalInitiated(
address(0),
_l2Token,
msg.sender,
msg.sender,
_amount,
_data
);
}
} }
import { Contract } from 'ethers' import { Contract } from 'ethers'
import { ethers } from 'hardhat' import { ethers } from 'hardhat'
import { predeploys } from '@eth-optimism/contracts'
import { expect } from './setup' import { expect } from './setup'
import { import {
...@@ -255,4 +256,50 @@ describe('CrossChainMessenger', () => { ...@@ -255,4 +256,50 @@ describe('CrossChainMessenger', () => {
) )
}) })
}) })
describe('withdrawETH', () => {
let l2Messenger: Contract
let l2Bridge: Contract
let provider: CrossChainProvider
let messenger: CrossChainMessenger
beforeEach(async () => {
l2Messenger = (await (
await ethers.getContractFactory('MockMessenger')
).deploy()) as any
l2Bridge = (await (
await ethers.getContractFactory('MockBridge')
).deploy(l2Messenger.address)) as any
provider = new CrossChainProvider({
l1Provider: ethers.provider,
l2Provider: ethers.provider,
l1ChainId: 31337,
contracts: {
l2: {
L2CrossDomainMessenger: l2Messenger.address,
L2StandardBridge: l2Bridge.address,
},
},
})
messenger = new CrossChainMessenger({
provider,
l1Signer,
l2Signer,
})
})
it('should trigger the deposit ETH function with the given amount', async () => {
await expect(messenger.withdrawETH(100000))
.to.emit(l2Bridge, 'WithdrawalInitiated')
.withArgs(
ethers.constants.AddressZero,
predeploys.OVM_ETH,
await l2Signer.getAddress(),
await l2Signer.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