diff --git a/package.json b/package.json index aeb340ab8c..369ce70ce1 100644 --- a/package.json +++ b/package.json @@ -48,20 +48,16 @@ "@ethersproject/address": "^5.0.8", "@ethersproject/bignumber": "^5.1.1", "@ethersproject/bytes": "^5.0.8", - "@typechain/ethers-v5": "9.0.0", - "@types/prompts": "^2.0.14", - "@types/yargs": "^17.0.9", - "dotenv": "^10.0.0", - "ethers": "^5.1.0", - "ts-node": "^10.2.1", - "typechain": "7.0.0" + "ethers": "^5.1.0" }, "devDependencies": { - "@arbitrum/nitro-contracts": "1.0.0-beta.5", + "@arbitrum/nitro-contracts": "https://gitpkg.now.sh/OffchainLabs/nitro/contracts?expose-outbox-isspent", "@nomiclabs/hardhat-ethers": "^2.0.4", + "@typechain/ethers-v5": "9.0.0", "@types/chai": "^4.2.11", "@types/mocha": "^9.0.0", "@types/prompts": "^2.0.14", + "@types/yargs": "^17.0.9", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/eslint-plugin-tslint": "^5.27.1", "@typescript-eslint/parser": "^5.14.0", @@ -70,6 +66,7 @@ "axios": "^0.21.3", "chai": "^4.2.0", "chalk": "^4.1.0", + "dotenv": "^10.0.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-mocha": "^9.0.0", @@ -80,7 +77,9 @@ "prettier": "^2.3.2", "prettier-plugin-solidity": "^1.0.0-beta.17", "prompts": "^2.4.2", + "ts-node": "^10.2.1", "tslint": "^6.1.3", + "typechain": "7.0.0", "typedoc": "^0.21.5", "typedoc-plugin-markdown": "^3.10.4", "typescript": "^4.2.2", diff --git a/scripts/instantiate_bridge.ts b/scripts/instantiate_bridge.ts index 98cc34ae69..e20c083c02 100644 --- a/scripts/instantiate_bridge.ts +++ b/scripts/instantiate_bridge.ts @@ -59,25 +59,25 @@ export const instantiateBridge = ( throw new Error('need ARB_KEY var') } - let networkID = args.networkID - if (!networkID) { + let l2NetworkID = args.networkID + if (!l2NetworkID) { console.log( 'No networkID command line arg provided; using network', defaultNetworkId ) - networkID = defaultNetworkId + l2NetworkID = defaultNetworkId } - const isL1 = isDefined(l1Networks[networkID]) - const isL2 = isDefined(l2Networks[networkID]) + const isL1 = isDefined(l1Networks[l2NetworkID]) + const isL2 = isDefined(l2Networks[l2NetworkID]) if (!isL1 && !isL2) { - throw new Error(`Unrecognized network ID: ${networkID}`) + throw new Error(`Unrecognized network ID: ${l2NetworkID}`) } if (!isL2) { - throw new Error(`Tests must specify an L2 network ID: ${networkID}`) + throw new Error(`Tests must specify an L2 network ID: ${l2NetworkID}`) } - const l2Network = l2Networks[networkID] + const l2Network = l2Networks[l2NetworkID] const l1Network = l1Networks[l2Network.partnerChainID] if (!l1Network) { @@ -86,14 +86,26 @@ export const instantiateBridge = ( ) } - if (!l1Network.rpcURL) { - throw new Error('L1 rpc url not set (see .env.sample or networks.ts)') - } - if (!l2Network.rpcURL) { - throw new Error('L2 rpc url not set (see .env.sample or utils/networks.ts)') - } - const ethProvider = new JsonRpcProvider(l1Network.rpcURL) - const arbProvider = new JsonRpcProvider(l2Network.rpcURL) + const l1Rpc = (() => { + if (l2NetworkID === 42161) return process.env['MAINNET_RPC'] as string + if (l2NetworkID === 421611) return process.env['RINKEBY_RPC'] as string + if (l2NetworkID === 1338) return 'http://127.0.0.1:8545/' + throw new Error( + 'L1 rpc url not set (see .env.sample or networks.ts) or chain id not supported' + ) + })() + const l2Rpc = (() => { + if (l2NetworkID === 42161) + return process.env['ARB_ONE_RPC'] || 'https://arb1.arbitrum.io/rpc' + if (l2NetworkID === 421611) + return process.env['RINKARBY_RPC'] || 'https://rinkeby.arbitrum.io/rpc' + throw new Error( + 'L2 rpc url not set (see .env.sample or networks.ts) or chain id not supported' + ) + })() + + const ethProvider = new JsonRpcProvider(l1Rpc) + const arbProvider = new JsonRpcProvider(l2Rpc) const l1Signer = (() => { if (l1PkParam) { diff --git a/scripts/testSetup.ts b/scripts/testSetup.ts index 69c5bb40ad..b2202d47ea 100644 --- a/scripts/testSetup.ts +++ b/scripts/testSetup.ts @@ -88,7 +88,6 @@ export const getCustomNetworks = async ( isCustom: true, name: 'EthLocal', partnerChainIDs: [l2NetworkInfo.chainId], - rpcURL: l1Url, } const l2Network: Omit = { @@ -106,7 +105,6 @@ export const getCustomNetworks = async ( isCustom: true, name: 'ArbLocal', partnerChainID: l1NetworkInfo.chainId, - rpcURL: l2Url, retryableLifetimeSeconds: 7 * 24 * 60 * 60, } return { diff --git a/src/lib/dataEntities/networks.ts b/src/lib/dataEntities/networks.ts index 8db5886ea5..624e85c5a2 100644 --- a/src/lib/dataEntities/networks.ts +++ b/src/lib/dataEntities/networks.ts @@ -16,13 +16,10 @@ /* eslint-env node */ 'use strict' -import dotenv from 'dotenv' import { SignerOrProvider, SignerProviderUtils } from './signerOrProvider' import { ArbSdkError } from '../dataEntities/errors' import { SEVEN_DAYS_IN_SECONDS } from './constants' -dotenv.config() - export interface L1Network extends Network { partnerChainIDs: number[] blockTime: number //seconds @@ -40,7 +37,6 @@ export interface Network { chainID: number name: string explorerUrl: string - rpcURL: string gif?: string isCustom: boolean } @@ -135,7 +131,6 @@ export const l1Networks: L1Networks = { explorerUrl: 'https://etherscan.io', partnerChainIDs: [42161], blockTime: 14, - rpcURL: process.env['MAINNET_RPC'] as string, isCustom: false, }, 1338: { @@ -144,7 +139,6 @@ export const l1Networks: L1Networks = { explorerUrl: 'https://etherscan.io', partnerChainIDs: [42161], blockTime: 1, - rpcURL: 'http://127.0.0.1:8545/', isCustom: false, }, 4: { @@ -153,7 +147,6 @@ export const l1Networks: L1Networks = { explorerUrl: 'https://rinkeby.etherscan.io', partnerChainIDs: [421611], blockTime: 15, - rpcURL: process.env['RINKEBY_RPC'] as string, isCustom: false, }, } @@ -168,7 +161,6 @@ export const l2Networks: L2Networks = { tokenBridge: mainnetTokenBridge, ethBridge: mainnetETHBridge, confirmPeriodBlocks: 45818, - rpcURL: process.env['ARB_ONE_RPC'] || 'https://arb1.arbitrum.io/rpc', isCustom: false, retryableLifetimeSeconds: SEVEN_DAYS_IN_SECONDS, }, @@ -181,7 +173,6 @@ export const l2Networks: L2Networks = { tokenBridge: rinkebyTokenBridge, ethBridge: rinkebyETHBridge, confirmPeriodBlocks: 6545, // TODO - rpcURL: process.env['RINKARBY_RPC'] || 'https://rinkeby.arbitrum.io/rpc', isCustom: false, retryableLifetimeSeconds: SEVEN_DAYS_IN_SECONDS, }, diff --git a/src/lib/inbox/inbox.ts b/src/lib/inbox/inbox.ts index eb2c36b411..8fba328c83 100644 --- a/src/lib/inbox/inbox.ts +++ b/src/lib/inbox/inbox.ts @@ -226,7 +226,9 @@ export class InboxTools { return null } - const delayedAcc = await bridge.inboxAccs(eventInfo.event.messageIndex) + const delayedAcc = await bridge.delayedInboxAccs( + eventInfo.event.messageIndex + ) return { ...eventInfo, delayedAcc: delayedAcc } } diff --git a/src/lib/message/L1ToL2Message.ts b/src/lib/message/L1ToL2Message.ts index cf641d71ef..58593457ba 100644 --- a/src/lib/message/L1ToL2Message.ts +++ b/src/lib/message/L1ToL2Message.ts @@ -127,16 +127,13 @@ export abstract class L1ToL2Message { return ethers.utils.stripZeros(value.toHexString()) } - const addressAlias = new Address(fromAddress) - - const from = addressAlias.applyAlias() const chainId = BigNumber.from(l2ChainId) const msgNum = BigNumber.from(messageNumber) const fields: any[] = [ formatNumber(chainId), zeroPad(formatNumber(msgNum), 32), - from.value, + fromAddress, formatNumber(l1BaseFee), formatNumber(l1Value), @@ -433,7 +430,20 @@ export class L1ToL2MessageReader extends L1ToL2Message { } // not redeemed, has it now expired - if (await this.isExpired()) { + try { + if (await this.isExpired()) { + return L1ToL2MessageStatus.EXPIRED + } + } catch (error) { + // this can happen due to a race condition that + // the retryable is redeemed/expired in between the calls + const successfulRedeemReceiptRetry = await this.getSuccessfulRedeem() + if ( + successfulRedeemReceiptRetry && + successfulRedeemReceiptRetry.status === 1 + ) { + return L1ToL2MessageStatus.REDEEMED + } return L1ToL2MessageStatus.EXPIRED } diff --git a/src/lib/message/L2ToL1Message.ts b/src/lib/message/L2ToL1Message.ts index a6a80b9b9e..51b72ab768 100644 --- a/src/lib/message/L2ToL1Message.ts +++ b/src/lib/message/L2ToL1Message.ts @@ -204,7 +204,7 @@ export class L2ToL1MessageReader extends L2ToL1Message { this.l1Provider ) - return outbox.callStatic.spent(this.event.position) + return outbox.callStatic.isSpent(this.event.position) } /** diff --git a/yarn.lock b/yarn.lock index 193a633a58..88d3047749 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,6 +19,14 @@ "@openzeppelin/contracts-upgradeable" "4.5.2" hardhat "^2.6.6" +"@arbitrum/nitro-contracts@https://gitpkg.now.sh/OffchainLabs/nitro/contracts?expose-outbox-isspent": + version "1.0.0-beta.5" + resolved "https://gitpkg.now.sh/OffchainLabs/nitro/contracts?expose-outbox-isspent#47069a151c59a26efad04764c9c56e33af22bfe1" + dependencies: + "@openzeppelin/contracts" "4.5.0" + "@openzeppelin/contracts-upgradeable" "4.5.2" + hardhat "^2.6.6" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"