Commit b8226080 authored by Kelvin Fichter's avatar Kelvin Fichter

feat(sdk): implement depositETH

Implements the depositETH function for the upcoming Optimism JS SDK.
Very basic functionality, only allows users to deposit to their own
accounts. We can consider adding the ability to deposit to other
accounts as part of a future PR.
parent d14ee9fa
......@@ -44,7 +44,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides?: L1ToL2Overrides
): Promise<TransactionResponse> {
const tx = await this.populateTransaction.sendMessage(message, overrides)
if (message.direction === MessageDirection.L1_TO_L2) {
return this.l1Signer.sendTransaction(tx)
} else {
......@@ -57,13 +56,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit: NumberLike,
overrides?: Overrides
): Promise<TransactionResponse> {
const tx = await this.populateTransaction.resendMessage(
message,
messageGasLimit,
overrides
return this.l1Signer.sendTransaction(
await this.populateTransaction.resendMessage(
message,
messageGasLimit,
overrides
)
)
return this.l1Signer.sendTransaction(tx)
}
public async finalizeMessage(
......@@ -77,7 +76,9 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike,
overrides?: L1ToL2Overrides
): Promise<TransactionResponse> {
throw new Error('Not implemented')
return this.l1Signer.sendTransaction(
await this.populateTransaction.depositETH(amount, overrides)
)
}
public async withdrawETH(
......@@ -148,7 +149,14 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike,
overrides?: L1ToL2Overrides
): 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 (
......@@ -165,7 +173,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides?: L1ToL2Overrides
): Promise<BigNumber> => {
const tx = await this.populateTransaction.sendMessage(message, overrides)
if (message.direction === MessageDirection.L1_TO_L2) {
return this.provider.l1Provider.estimateGas(tx)
} else {
......@@ -183,7 +190,6 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit,
overrides
)
return this.provider.l1Provider.estimateGas(tx)
},
......@@ -198,7 +204,8 @@ export class CrossChainMessenger implements ICrossChainMessenger {
amount: NumberLike,
overrides?: L1ToL2Overrides
): Promise<BigNumber> => {
throw new Error('Not implemented')
const tx = await this.populateTransaction.depositETH(amount, overrides)
return this.provider.l1Provider.estimateGas(tx)
},
withdrawETH: async (
......
......@@ -3,6 +3,13 @@ pragma solidity ^0.8.9;
import { MockMessenger } from "./MockMessenger.sol";
contract MockBridge {
event ETHDepositInitiated(
address indexed _from,
address indexed _to,
uint256 _amount,
bytes _data
);
event ERC20DepositInitiated(
address indexed _l1Token,
address indexed _l2Token,
......@@ -110,4 +117,19 @@ contract MockBridge {
) public {
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', () => {
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