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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import {
getContractFactory,
getContractInterface,
} from '@eth-optimism/contracts'
import { Watcher } from '@eth-optimism/core-utils'
import {
Contract,
Wallet,
constants,
providers,
BigNumberish,
BigNumber,
} from 'ethers'
import { Direction, waitForXDomainTransaction } from './watcher-utils'
export const GWEI = BigNumber.from(1e9)
// The hardhat instance
const l1HttpPort = 9545
export const l1Provider = new providers.JsonRpcProvider(
`http://localhost:${l1HttpPort}`
)
l1Provider.pollingInterval = 10
const httpPort = 8545
export const l2Provider = new providers.JsonRpcProvider(
`http://localhost:${httpPort}`
)
l2Provider.pollingInterval = 10
// The sequencer private key which is funded on L1
export const l1Wallet = new Wallet(
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
l1Provider
)
// A random private key which should always be funded with deposits from L1 -> L2
// if it's using non-0 gas price
export const l2Wallet = l1Wallet.connect(l2Provider)
// Predeploys
export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS =
'0x4200000000000000000000000000000000000004'
export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
// The address manager is always at the same address in testnet deployments
export const addressManagerAddress =
'0x5FbDB2315678afecb367f032d93F642f64180aa3'
export const getAddressManager = (provider: any) => {
return getContractFactory('Lib_AddressManager')
.connect(provider)
.attach(addressManagerAddress)
}
// Gets the gateway using the proxy if available
export const getGateway = async (wallet: Wallet, AddressManager: Contract) => {
const l1GatewayInterface = getContractInterface('OVM_L1ETHGateway')
const ProxyGatewayAddress = await AddressManager.getAddress(
'Proxy__OVM_L1ETHGateway'
)
const addressToUse =
ProxyGatewayAddress !== constants.AddressZero
? ProxyGatewayAddress
: await AddressManager.getAddress('OVM_L1ETHGateway')
const OVM_L1ETHGateway = new Contract(
addressToUse,
l1GatewayInterface,
wallet
)
return OVM_L1ETHGateway
}
export const getOvmEth = (wallet: Wallet) => {
const OVM_ETH = new Contract(
OVM_ETH_ADDRESS,
getContractInterface('OVM_ETH'),
wallet
)
return OVM_ETH
}
export const fundUser = async (
watcher: Watcher,
gateway: Contract,
amount: BigNumberish,
recipient?: string
) => {
const value = BigNumber.from(amount)
const tx = recipient
? gateway.depositTo(recipient, { value })
: gateway.deposit({ value })
await waitForXDomainTransaction(watcher, tx, Direction.L1ToL2)
}
export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))