1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import {
JsonRpcProvider,
TransactionReceipt,
TransactionResponse,
} from '@ethersproject/providers'
import { Watcher } from '@eth-optimism/core-utils'
import { Contract, Transaction } from 'ethers'
export const initWatcher = async (
l1Provider: JsonRpcProvider,
l2Provider: JsonRpcProvider,
AddressManager: Contract
) => {
const l1MessengerAddress = await AddressManager.getAddress(
'Proxy__OVM_L1CrossDomainMessenger'
)
const l2MessengerAddress = await AddressManager.getAddress(
'L2CrossDomainMessenger'
)
return new Watcher({
l1: {
provider: l1Provider,
messengerAddress: l1MessengerAddress,
},
l2: {
provider: l2Provider,
messengerAddress: l2MessengerAddress,
},
})
}
export interface CrossDomainMessagePair {
tx: Transaction
receipt: TransactionReceipt
remoteTx: Transaction
remoteReceipt: TransactionReceipt
}
export enum Direction {
L1ToL2,
L2ToL1,
}
export const waitForXDomainTransaction = async (
watcher: Watcher,
tx: Promise<TransactionResponse> | TransactionResponse,
direction: Direction
): Promise<CrossDomainMessagePair> => {
const { src, dest } =
direction === Direction.L1ToL2
? { src: watcher.l1, dest: watcher.l2 }
: { src: watcher.l2, dest: watcher.l1 }
// await it if needed
tx = await tx
// get the receipt and the full transaction
const receipt = await tx.wait()
const fullTx = await src.provider.getTransaction(tx.hash)
// get the message hash which was created on the SentMessage
const [xDomainMsgHash] = await watcher.getMessageHashesFromTx(src, tx.hash)
if (!xDomainMsgHash) {
throw new Error(`No x-domain message hash for tx hash ${tx.hash}, bailing.`)
}
// Get the transaction and receipt on the remote layer
const remoteReceipt = await watcher.getTransactionReceipt(
dest,
xDomainMsgHash
)
const remoteTx = await dest.provider.getTransaction(
remoteReceipt.transactionHash
)
return {
tx: fullTx,
receipt,
remoteTx,
remoteReceipt,
}
}