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 {
TransactionRequest,
TransactionResponse,
} from '@ethersproject/abstract-provider'
import { predeploys } from '@eth-optimism/contracts'
import {
CrossChainMessageRequest,
......@@ -85,7 +86,9 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike,
overrides?: Overrides
): Promise<TransactionResponse> {
throw new Error('Not implemented')
return this.l2Signer.sendTransaction(
await this.populateTransaction.withdrawETH(amount, overrides)
)
}
populateTransaction = {
......@@ -163,7 +166,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike,
overrides?: Overrides
): 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 {
amount: NumberLike,
overrides?: Overrides
): 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 {
_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 { ethers } from 'hardhat'
import { predeploys } from '@eth-optimism/contracts'
import { expect } from './setup'
import {
......@@ -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