@hyperlane-xyz/core
Version:
Core solidity contracts for Hyperlane
137 lines (119 loc) • 3.82 kB
text/typescript
import { execSync } from 'child_process'
import { ContractFactory, Signer, ethers } from 'ethers'
import * as http from 'http'
import { IReader4844, IReader4844__factory } from '../../build/types'
import { JsonRpcProvider } from '@ethersproject/providers'
import { bytecode as Reader4844Bytecode } from '../../out/yul/Reader4844.yul/Reader4844.json'
const wait = async (ms: number) =>
new Promise(res => {
setTimeout(res, ms)
})
export class Toolkit4844 {
public static DATA_BLOB_HEADER_FLAG = '0x50' // 0x40 | 0x10
public static postDataToGeth(body: any): Promise<any> {
return new Promise((resolve, reject) => {
const options = {
hostname: '127.0.0.1',
port: 8545,
path: '/',
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=UTF-8',
'Content-Length': Buffer.byteLength(JSON.stringify(body)),
},
}
const req = http.request(options, res => {
let data = ''
// Event emitted when a chunk of data is received
res.on('data', chunk => {
data += chunk
})
// Event emitted when the response is fully received
res.on('end', () => {
resolve(JSON.parse(data))
})
})
// Handle any errors
req.on('error', error => {
reject(error)
})
// Send the POST data
req.write(JSON.stringify(body))
// Close the request
req.end()
})
}
public static async getTx(
txHash: string
): Promise<ethers.providers.TransactionResponse> {
const body = {
method: 'eth_getTransactionByHash',
params: [txHash],
id: Date.now(),
jsonrpc: '2.0',
}
return (await this.postDataToGeth(body))['result']
}
public static async getTxReceipt(
txHash: string
): Promise<ethers.providers.TransactionReceipt> {
const body = {
method: 'eth_getTransactionReceipt',
params: [txHash],
id: Date.now(),
jsonrpc: '2.0',
}
return (await this.postDataToGeth(body))['result']
}
public static async chainId(): Promise<any> {
const body = {
method: 'eth_chainId',
params: [],
id: Date.now(),
jsonrpc: '2.0',
}
return (await this.postDataToGeth(body))['result']
}
public static isReplacementError(err: string) {
const errRegex =
/Error while sending transaction: replacement transaction underpriced:/
const match = err.match(errRegex)
return Boolean(match)
}
public static async waitUntilBlockMined(
blockNumber: number,
provider: JsonRpcProvider
) {
while ((await provider.getBlockNumber()) <= blockNumber) {
await wait(300)
}
}
public static async sendBlobTx(
privKey: string,
to: string,
blobs: string[],
data: string
) {
const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '')
const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob@sha256:8fd6dfe19bedf43f485f1d5ef3db0a0af569c1a08eacc117d5c5ba43656989f0 blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1`
const res = execSync(blobCommand).toString()
const txHashRegex = /0x[a-fA-F0-9]{64}/
const match = res.match(txHashRegex)
if (match) {
await wait(10000)
return match[0]
} else {
throw new Error('Error sending blob tx:\n' + res)
}
}
public static async deployReader4844(wallet: Signer): Promise<IReader4844> {
const contractFactory = new ContractFactory(
IReader4844__factory.abi,
Reader4844Bytecode,
wallet
)
const reader4844 = await contractFactory.deploy()
await reader4844.deployed()
return IReader4844__factory.connect(reader4844.address, wallet)
}
}