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
import { ethers } from 'ethers'
import { task } from 'hardhat/config'
import * as types from 'hardhat/internal/core/params/argumentTypes'
import { SequencerBatch } from '@eth-optimism/core-utils'
import { names } from '../src/address-names'
import { getContractFromArtifact } from '../src/deploy-utils'
// Need to export env vars
// CONTRACTS_TARGET_NETWORK
// CONTRACTS_DEPLOYER_KEY
// CONTRACTS_RPC_URL
task('fetch-batches')
.addOptionalParam(
'contractsRpcUrl',
'Ethereum HTTP Endpoint',
process.env.CONTRACTS_RPC_URL || 'http://127.0.0.1:8545',
types.string
)
.addOptionalParam('start', 'Start block height', 0, types.int)
.addOptionalParam('end', 'End block height', undefined, types.int)
.setAction(async (args, hre) => {
const provider = new ethers.providers.StaticJsonRpcProvider(
args.contractsRpcUrl
)
let CanonicalTransactionChain = await getContractFromArtifact(
hre,
names.managed.contracts.CanonicalTransactionChain
)
CanonicalTransactionChain = CanonicalTransactionChain.connect(provider)
const start = args.start
let end = args.end
if (!end) {
end = await provider.getBlockNumber()
}
const batches = []
for (let i = start; i <= end; i += 2001) {
const tip = Math.min(i + 2000, end)
console.error(`Querying events ${i}-${tip}`)
const events = await CanonicalTransactionChain.queryFilter(
CanonicalTransactionChain.filters.SequencerBatchAppended(),
i,
tip
)
for (const event of events) {
const tx = await provider.getTransaction(event.transactionHash)
const batch = (SequencerBatch as any).fromHex(tx.data)
batches.push(batch.toJSON())
}
}
console.log(JSON.stringify(batches, null, 2))
})