Skip to content

Commit b93353a

Browse files
Merge pull request #2122 from ethereum-optimism/sc/sdk-integration-1
feat(sdk): start using sdk in integration tests
2 parents adce9c2 + edb2184 commit b93353a

8 files changed

Lines changed: 90 additions & 81 deletions

File tree

.changeset/tricky-bees-sneeze.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@eth-optimism/integration-tests': patch
3+
---
4+
5+
Updates integration tests to start using SDK

integration-tests/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"@eth-optimism/contracts": "0.5.11",
3232
"@eth-optimism/core-utils": "0.7.5",
3333
"@eth-optimism/message-relayer": "0.2.15",
34+
"@eth-optimism/sdk": "0.0.7",
3435
"@ethersproject/abstract-provider": "^5.5.1",
3536
"@ethersproject/providers": "^5.4.5",
3637
"@ethersproject/transactions": "^5.4.0",
Lines changed: 62 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
/* Imports: External */
22
import { Contract, ContractFactory } from 'ethers'
33
import { ethers } from 'hardhat'
4-
import { applyL1ToL2Alias, awaitCondition } from '@eth-optimism/core-utils'
4+
import { MessageDirection, MessageStatus } from '@eth-optimism/sdk'
5+
import {
6+
applyL1ToL2Alias,
7+
awaitCondition,
8+
sleep,
9+
} from '@eth-optimism/core-utils'
510

611
/* Imports: Internal */
712
import { expect } from './shared/setup'
8-
import { Direction } from './shared/watcher-utils'
913
import { OptimismEnv } from './shared/env'
1014
import {
1115
DEFAULT_TEST_GAS_L1,
1216
DEFAULT_TEST_GAS_L2,
1317
envConfig,
14-
sleep,
1518
withdrawalTest,
1619
} from './shared/utils'
1720

@@ -56,23 +59,35 @@ describe('Basic L1<>L2 Communication', async () => {
5659
const value = `0x${'77'.repeat(32)}`
5760

5861
// Send L2 -> L1 message.
59-
const transaction = await env.l2Messenger.sendMessage(
60-
L1SimpleStorage.address,
61-
L1SimpleStorage.interface.encodeFunctionData('setValue', [value]),
62-
5000000,
62+
const transaction = await env.messenger.sendMessage(
63+
{
64+
direction: MessageDirection.L2_TO_L1,
65+
target: L1SimpleStorage.address,
66+
message: L1SimpleStorage.interface.encodeFunctionData('setValue', [
67+
value,
68+
]),
69+
},
6370
{
64-
gasLimit: DEFAULT_TEST_GAS_L2,
71+
overrides: {
72+
gasLimit: DEFAULT_TEST_GAS_L2,
73+
},
6574
}
6675
)
67-
await transaction.wait()
68-
await env.relayXDomainMessages(transaction)
69-
await env.waitForXDomainTransaction(transaction, Direction.L2ToL1)
76+
77+
let status: MessageStatus
78+
while (status !== MessageStatus.READY_FOR_RELAY) {
79+
status = await env.messenger.getMessageStatus(transaction)
80+
await sleep(1000)
81+
}
82+
83+
await env.messenger.finalizeMessage(transaction)
84+
await env.messenger.waitForMessageReceipt(transaction)
7085

7186
expect(await L1SimpleStorage.msgSender()).to.equal(
72-
env.l1Messenger.address
87+
env.messenger.contracts.l1.L1CrossDomainMessenger.address
7388
)
7489
expect(await L1SimpleStorage.xDomainSender()).to.equal(
75-
env.l2Wallet.address
90+
await env.messenger.l2Signer.getAddress()
7691
)
7792
expect(await L1SimpleStorage.value()).to.equal(value)
7893
expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(1)
@@ -85,25 +100,36 @@ describe('Basic L1<>L2 Communication', async () => {
85100
const value = `0x${'42'.repeat(32)}`
86101

87102
// Send L1 -> L2 message.
88-
const transaction = await env.l1Messenger.sendMessage(
89-
L2SimpleStorage.address,
90-
L2SimpleStorage.interface.encodeFunctionData('setValue', [value]),
91-
5000000,
103+
const transaction = await env.messenger.sendMessage(
104+
{
105+
direction: MessageDirection.L1_TO_L2,
106+
target: L2SimpleStorage.address,
107+
message: L2SimpleStorage.interface.encodeFunctionData('setValue', [
108+
value,
109+
]),
110+
},
92111
{
93-
gasLimit: DEFAULT_TEST_GAS_L1,
112+
l2GasLimit: 5000000,
113+
overrides: {
114+
gasLimit: DEFAULT_TEST_GAS_L1,
115+
},
94116
}
95117
)
96118

97-
await env.waitForXDomainTransaction(transaction, Direction.L1ToL2)
119+
const receipt = await env.messenger.waitForMessageReceipt(transaction)
98120

121+
console.log(await env.messenger.l2Signer.getAddress())
122+
expect(receipt.transactionReceipt.status).to.equal(1)
99123
expect(await L2SimpleStorage.msgSender()).to.equal(
100-
env.l2Messenger.address
124+
env.messenger.contracts.l2.L2CrossDomainMessenger.address
101125
)
102126
expect(await L2SimpleStorage.txOrigin()).to.equal(
103-
applyL1ToL2Alias(env.l1Messenger.address)
127+
applyL1ToL2Alias(
128+
env.messenger.contracts.l1.L1CrossDomainMessenger.address
129+
)
104130
)
105131
expect(await L2SimpleStorage.xDomainSender()).to.equal(
106-
env.l1Wallet.address
132+
await env.messenger.l1Signer.getAddress()
107133
)
108134
expect(await L2SimpleStorage.value()).to.equal(value)
109135
expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(1)
@@ -117,9 +143,10 @@ describe('Basic L1<>L2 Communication', async () => {
117143
const value = `0x${'42'.repeat(32)}`
118144

119145
// Send L1 -> L2 message.
120-
const tx = await env.ctc
121-
.connect(env.l1Wallet)
122-
.enqueue(
146+
const tx =
147+
await env.messenger.contracts.l1.CanonicalTransactionChain.connect(
148+
env.messenger.l1Signer
149+
).enqueue(
123150
L2SimpleStorage.address,
124151
5000000,
125152
L2SimpleStorage.interface.encodeFunctionData('setValueNotXDomain', [
@@ -129,78 +156,41 @@ describe('Basic L1<>L2 Communication', async () => {
129156
gasLimit: DEFAULT_TEST_GAS_L1,
130157
}
131158
)
159+
132160
const receipt = await tx.wait()
133161

134162
const waitUntilBlock =
135163
receipt.blockNumber + envConfig.DTL_ENQUEUE_CONFIRMATIONS
136-
let currBlock = await env.l1Provider.getBlockNumber()
164+
let currBlock = await env.messenger.l1Provider.getBlockNumber()
137165
while (currBlock <= waitUntilBlock) {
138166
const progress =
139167
envConfig.DTL_ENQUEUE_CONFIRMATIONS - (waitUntilBlock - currBlock)
140168
console.log(
141169
`Waiting for ${progress}/${envConfig.DTL_ENQUEUE_CONFIRMATIONS} confirmations.`
142170
)
143171
await sleep(5000)
144-
currBlock = await env.l1Provider.getBlockNumber()
172+
currBlock = await env.messenger.l1Provider.getBlockNumber()
145173
}
146174
console.log('Enqueue should be confirmed.')
147175

148176
await awaitCondition(
149177
async () => {
150178
const sender = await L2SimpleStorage.msgSender()
151-
return sender === env.l1Wallet.address
179+
return sender === (await env.messenger.l1Signer.getAddress())
152180
},
153181
2000,
154182
60
155183
)
156184

157185
// No aliasing when an EOA goes directly to L2.
158-
expect(await L2SimpleStorage.msgSender()).to.equal(env.l1Wallet.address)
159-
expect(await L2SimpleStorage.txOrigin()).to.equal(env.l1Wallet.address)
160-
expect(await L2SimpleStorage.value()).to.equal(value)
161-
expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(1)
162-
})
163-
164-
it('should have a receipt with a status of 1 for a successful message', async () => {
165-
const value = `0x${'42'.repeat(32)}`
166-
167-
// Send L1 -> L2 message.
168-
const transaction = await env.l1Messenger.sendMessage(
169-
L2SimpleStorage.address,
170-
L2SimpleStorage.interface.encodeFunctionData('setValue', [value]),
171-
5000000,
172-
{
173-
gasLimit: DEFAULT_TEST_GAS_L1,
174-
}
175-
)
176-
await transaction.wait()
177-
178-
const { remoteReceipt } = await env.waitForXDomainTransaction(
179-
transaction,
180-
Direction.L1ToL2
181-
)
182-
183-
expect(remoteReceipt.status).to.equal(1)
184-
})
185-
186-
// SKIP: until we decide what should be done in this case
187-
it.skip('should have a receipt with a status of 0 for a failed message', async () => {
188-
// Send L1 -> L2 message.
189-
const transaction = await env.l1Messenger.sendMessage(
190-
L2Reverter.address,
191-
L2Reverter.interface.encodeFunctionData('doRevert', []),
192-
5000000,
193-
{
194-
gasLimit: DEFAULT_TEST_GAS_L1,
195-
}
186+
expect(await L2SimpleStorage.msgSender()).to.equal(
187+
await env.messenger.l1Signer.getAddress()
196188
)
197-
198-
const { remoteReceipt } = await env.waitForXDomainTransaction(
199-
transaction,
200-
Direction.L1ToL2
189+
expect(await L2SimpleStorage.txOrigin()).to.equal(
190+
await env.messenger.l1Signer.getAddress()
201191
)
202-
203-
expect(remoteReceipt.status).to.equal(0)
192+
expect(await L2SimpleStorage.value()).to.equal(value)
193+
expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(1)
204194
})
205195
})
206196
})

integration-tests/test/shared/env.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { TransactionResponse } from '@ethersproject/providers'
44
import { getContractFactory, predeploys } from '@eth-optimism/contracts'
55
import { Watcher } from '@eth-optimism/core-utils'
66
import { getMessagesAndProofsForL2Transaction } from '@eth-optimism/message-relayer'
7+
import { CrossChainMessenger } from '@eth-optimism/sdk'
78

89
/* Imports: Internal */
910
import {
@@ -55,6 +56,7 @@ export class OptimismEnv {
5556
l2Wallet: Wallet
5657

5758
// The providers
59+
messenger: CrossChainMessenger
5860
l1Provider: providers.JsonRpcProvider
5961
l2Provider: providers.JsonRpcProvider
6062
replicaProvider: providers.JsonRpcProvider
@@ -73,6 +75,7 @@ export class OptimismEnv {
7375
this.watcher = args.watcher
7476
this.l1Wallet = args.l1Wallet
7577
this.l2Wallet = args.l2Wallet
78+
this.messenger = args.messenger
7679
this.l1Provider = args.l1Provider
7780
this.l2Provider = args.l2Provider
7881
this.replicaProvider = args.replicaProvider
@@ -126,6 +129,13 @@ export class OptimismEnv {
126129
.connect(l2Wallet)
127130
.attach(predeploys.OVM_L1BlockNumber)
128131

132+
const network = await l1Provider.getNetwork()
133+
const messenger = new CrossChainMessenger({
134+
l1SignerOrProvider: l1Wallet,
135+
l2SignerOrProvider: l2Wallet,
136+
l1ChainId: network.chainId,
137+
})
138+
129139
return new OptimismEnv({
130140
addressManager,
131141
l1Bridge,
@@ -141,6 +151,7 @@ export class OptimismEnv {
141151
watcher,
142152
l1Wallet,
143153
l2Wallet,
154+
messenger,
144155
l1Provider,
145156
l2Provider,
146157
verifierProvider,

ops/docker/Dockerfile.integration-tests

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ COPY --from=builder /optimism/*.json /optimism/yarn.lock ./
1212
COPY --from=builder /optimism/node_modules ./node_modules
1313

1414
# copy deps (would have been nice if docker followed the symlinks required)
15+
COPY --from=builder /optimism/packages/sdk/package.json ./packages/sdk/package.json
16+
COPY --from=builder /optimism/packages/sdk/dist ./packages/sdk/dist
17+
1518
COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
1619
COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
1720

ops/docker/Dockerfile.packages

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ RUN apt-get update -y && apt-get install -y git curl jq python3
1313
# us to cache the installation steps
1414
WORKDIR /opt/optimism
1515
COPY *.json yarn.lock ./
16+
COPY packages/sdk/package.json ./packages/sdk/package.json
1617
COPY packages/core-utils/package.json ./packages/core-utils/package.json
1718
COPY packages/common-ts/package.json ./packages/common-ts/package.json
1819
COPY packages/contracts/package.json ./packages/contracts/package.json

packages/sdk/src/utils/contracts.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,14 @@ export const CONTRACT_ADDRESSES: {
9090
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
9191
},
9292
// Hardhat local
93-
// TODO: Get the actual addresses for this, temporary addresses here are fine for now until we
94-
// start using this package in the integration tests.
9593
31337: {
9694
l1: {
97-
AddressManager: '0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D',
98-
L1CrossDomainMessenger: '0xEcC89b9EDD804850C4F343A278Be902be11AaF42',
99-
L1StandardBridge: '0x73298186A143a54c20ae98EEE5a025bD5979De02',
100-
StateCommitmentChain: '0x1afcA918eff169eE20fF8AB6Be75f3E872eE1C1A',
101-
CanonicalTransactionChain: '0x2ebA8c4EfDB39A8Cd8f9eD65c50ec079f7CEBD81',
102-
BondManager: '0xE5AE60bD6F8DEe4D0c2BC9268e23B92F1cacC58F',
95+
AddressManager: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
96+
L1CrossDomainMessenger: '0x8A791620dd6260079BF849Dc5567aDC3F2FdC318',
97+
L1StandardBridge: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788',
98+
StateCommitmentChain: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',
99+
CanonicalTransactionChain: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9',
100+
BondManager: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707',
103101
},
104102
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
105103
},

packages/sdk/src/utils/merkle-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
toRpcHexString,
77
} from '@eth-optimism/core-utils'
88
import { MerkleTree } from 'merkletreejs'
9-
import rlp from 'rlp'
9+
import * as rlp from 'rlp'
1010

1111
/**
1212
* Generates a Merkle proof (using the particular scheme we use within Lib_MerkleTree).

0 commit comments

Comments
 (0)