@hyperlane-xyz/core
Version:
Core solidity contracts for Hyperlane
133 lines (117 loc) • 3.51 kB
text/typescript
import { JsonRpcProvider } from '@ethersproject/providers'
import { L1Network, L2Network, addCustomNetwork } from '@arbitrum/sdk'
import { execSync } from 'child_process'
import { Bridge__factory } from '@arbitrum/sdk/dist/lib/abi/factories/Bridge__factory'
import { RollupAdminLogic__factory } from '@arbitrum/sdk/dist/lib/abi/factories/RollupAdminLogic__factory'
export const config = {
arbUrl: 'http://localhost:8547',
ethUrl: 'http://localhost:8545',
}
export const getCustomNetworks = async (
l1Url: string,
l2Url: string
): Promise<{
l1Network: L1Network
l2Network: Omit<L2Network, 'tokenBridge'> & { nativeToken: string }
}> => {
const l1Provider = new JsonRpcProvider(l1Url)
const l2Provider = new JsonRpcProvider(l2Url)
let deploymentData: string
let sequencerContainer = execSync(
'docker ps --filter "name=sequencer" --format "{{.Names}}"'
)
.toString()
.trim()
deploymentData = execSync(
`docker exec ${sequencerContainer} cat /config/deployment.json`
).toString()
const parsedDeploymentData = JSON.parse(deploymentData) as {
bridge: string
inbox: string
['sequencer-inbox']: string
rollup: string
['native-erc20-token']: string
}
const rollup = RollupAdminLogic__factory.connect(
parsedDeploymentData.rollup,
l1Provider
)
const confirmPeriodBlocks = await rollup.confirmPeriodBlocks()
const bridge = Bridge__factory.connect(
parsedDeploymentData.bridge,
l1Provider
)
const outboxAddr = await bridge.allowedOutboxList(0)
const l1NetworkInfo = await l1Provider.getNetwork()
const l2NetworkInfo = await l2Provider.getNetwork()
const l1Network: L1Network = {
blockTime: 10,
chainID: l1NetworkInfo.chainId,
explorerUrl: '',
isCustom: true,
name: 'EthLocal',
partnerChainIDs: [l2NetworkInfo.chainId],
isArbitrum: false,
}
const l2Network: Omit<L2Network, 'tokenBridge'> & { nativeToken: string } = {
chainID: l2NetworkInfo.chainId,
confirmPeriodBlocks: confirmPeriodBlocks.toNumber(),
ethBridge: {
bridge: parsedDeploymentData.bridge,
inbox: parsedDeploymentData.inbox,
outbox: outboxAddr,
rollup: parsedDeploymentData.rollup,
sequencerInbox: parsedDeploymentData['sequencer-inbox'],
},
nativeToken: parsedDeploymentData['native-erc20-token'],
explorerUrl: '',
isArbitrum: true,
isCustom: true,
name: 'ArbLocal',
partnerChainID: l1NetworkInfo.chainId,
retryableLifetimeSeconds: 7 * 24 * 60 * 60,
nitroGenesisBlock: 0,
nitroGenesisL1Block: 0,
depositTimeout: 900000,
}
return {
l1Network,
l2Network,
}
}
export const setupNetworks = async (l1Url: string, l2Url: string) => {
const { l1Network, l2Network: coreL2Network } = await getCustomNetworks(
l1Url,
l2Url
)
const l2Network: L2Network & { nativeToken: string } = {
...coreL2Network,
tokenBridge: {
l1CustomGateway: '',
l1ERC20Gateway: '',
l1GatewayRouter: '',
l1MultiCall: '',
l1ProxyAdmin: '',
l1Weth: '',
l1WethGateway: '',
l2CustomGateway: '',
l2ERC20Gateway: '',
l2GatewayRouter: '',
l2Multicall: '',
l2ProxyAdmin: '',
l2Weth: '',
l2WethGateway: '',
},
}
addCustomNetwork({
customL1Network: l1Network,
customL2Network: l2Network,
})
return {
l1Network,
l2Network,
}
}
export function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms))
}