From 958560b89563eb41b21aaee8ea6a5bc16ea7facf Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:25:01 -0400 Subject: [PATCH 01/10] chore: renames ParentChainTx to ParentTx and similar --- scripts/deployStandard.ts | 2 +- src/index.ts | 4 +- src/lib/assetBridger/assetBridger.ts | 4 +- src/lib/assetBridger/erc20Bridger.ts | 66 +++++++-------- src/lib/assetBridger/ethBridger.ts | 20 ++--- src/lib/message/ChildToParentMessage.ts | 2 +- src/lib/message/ChildToParentMessageNitro.ts | 2 +- src/lib/message/ChildTransaction.ts | 2 +- .../message/ParentToChildMessageCreator.ts | 8 +- .../ParentToChildMessageGasEstimator.ts | 6 +- src/lib/message/ParentTransaction.ts | 48 +++++------ tests/integration/customerc20.test.ts | 2 +- .../parentToChildMessageCreator.test.ts | 2 +- tests/integration/sanity.test.ts | 2 +- tests/integration/sendChildmsg.test.ts | 74 ++++++++-------- tests/integration/standarderc20.test.ts | 4 +- tests/integration/testHelpers.ts | 68 +++++++-------- tests/integration/weth.test.ts | 2 +- tests/unit/childBlocksForParentBlock.test.ts | 84 ++++++++++--------- tests/unit/parentToChildMessageEvents.test.ts | 20 ++--- 20 files changed, 211 insertions(+), 211 deletions(-) diff --git a/scripts/deployStandard.ts b/scripts/deployStandard.ts index addf09a074..fd66b2b680 100644 --- a/scripts/deployStandard.ts +++ b/scripts/deployStandard.ts @@ -102,7 +102,7 @@ const main = async () => { } /* check token not yet deployed */ - const l2TokenAddress = await erc20Bridger.getL2ERC20Address( + const l2TokenAddress = await erc20Bridger.getChildERC20Address( l1TokenAddress, l1Provider ) diff --git a/src/index.ts b/src/index.ts index 651064f129..25d97aa200 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,8 +28,8 @@ export { ChildToParentMessageReader, } from './lib/message/ChildToParentMessage' export { - ParentChainContractTransaction, - ParentChainTransactionReceipt, + ParentContractTransaction, + ParentTransactionReceipt, } from './lib/message/ParentTransaction' export { ParentToChildMessageStatus, diff --git a/src/lib/assetBridger/assetBridger.ts b/src/lib/assetBridger/assetBridger.ts index f4a7032dde..2d050c4de7 100644 --- a/src/lib/assetBridger/assetBridger.ts +++ b/src/lib/assetBridger/assetBridger.ts @@ -18,7 +18,7 @@ import { constants } from 'ethers' -import { ParentChainContractTransaction } from '../message/ParentTransaction' +import { ParentContractTransaction } from '../message/ParentTransaction' import { ChildContractTransaction } from '../message/ChildTransaction' import { @@ -82,7 +82,7 @@ export abstract class AssetBridger { */ public abstract deposit( params: DepositParams - ): Promise + ): Promise /** * Transfer assets from child-to-parent diff --git a/src/lib/assetBridger/erc20Bridger.ts b/src/lib/assetBridger/erc20Bridger.ts index ae5df85690..23442136b3 100644 --- a/src/lib/assetBridger/erc20Bridger.ts +++ b/src/lib/assetBridger/erc20Bridger.ts @@ -52,9 +52,9 @@ import { EventFetcher } from '../utils/eventFetcher' import { EthDepositParams, EthWithdrawParams } from './ethBridger' import { AssetBridger } from './assetBridger' import { - ParentChainContractCallTransaction, - ParentChainContractTransaction, - ParentChainTransactionReceipt, + ParentContractCallTransaction, + ParentContractTransaction, + ParentTransactionReceipt, } from '../message/ParentTransaction' import { ChildContractTransaction, @@ -75,7 +75,7 @@ import { isArbitrumChain } from '../utils/lib' export interface TokenApproveParams { /** - * L1 address of the ERC20 token contract + * Parent chain address of the ERC20 token contract */ erc20ParentAddress: string /** @@ -94,11 +94,11 @@ export interface Erc20DepositParams extends EthDepositParams { */ childProvider: Provider /** - * L1 address of the token ERC20 contract + * Parent chain address of the token ERC20 contract */ erc20ParentAddress: string /** - * L2 address of the entity receiving the funds. Defaults to the l1FromAddress + * Child chain address of the entity receiving the funds. Defaults to the l1FromAddress */ destinationAddress?: string /** @@ -125,7 +125,7 @@ export interface Erc20DepositParams extends EthDepositParams { export interface Erc20WithdrawParams extends EthWithdrawParams { /** - * L1 address of the token ERC20 contract + * Parent chain address of the token ERC20 contract */ erc20ParentAddress: string } @@ -341,7 +341,7 @@ export class Erc20Bridger extends AssetBridger< * Get the child chain events created by a withdrawal * @param childProvider * @param gatewayAddress - * @param parentChainTokenAddress + * @param parentTokenAddress * @param fromAddress * @param filter * @returns @@ -350,7 +350,7 @@ export class Erc20Bridger extends AssetBridger< childProvider: Provider, gatewayAddress: string, filter: { fromBlock: BlockTag; toBlock: BlockTag }, - parentChainTokenAddress?: string, + parentTokenAddress?: string, fromAddress?: string, toAddress?: string ): Promise<(EventArgs & { txHash: string })[]> { @@ -370,11 +370,11 @@ export class Erc20Bridger extends AssetBridger< ) ).map(a => ({ txHash: a.transactionHash, ...a.event })) - return parentChainTokenAddress + return parentTokenAddress ? events.filter( log => log.l1Token.toLocaleLowerCase() === - parentChainTokenAddress.toLocaleLowerCase() + parentTokenAddress.toLocaleLowerCase() ) : events } @@ -433,7 +433,7 @@ export class Erc20Bridger extends AssetBridger< } /** - * Get the L2 token contract at the provided address + * Get the child chain token contract at the provided address * Note: This function just returns a typed ethers object for the provided address, it doesnt * check the underlying form of the contract bytecode to see if it's an erc20, and doesn't ensure the validity * of any of the underlying functions on that contract. @@ -454,14 +454,14 @@ export class Erc20Bridger extends AssetBridger< * check the underlying form of the contract bytecode to see if it's an erc20, and doesn't ensure the validity * of any of the underlying functions on that contract. * @param parentProvider - * @param parentChainTokenAddr + * @param parentTokenAddr * @returns */ - public getParentChainTokenContract( + public getParentTokenContract( parentProvider: Provider, - parentChainTokenAddr: string + parentTokenAddr: string ): ERC20 { - return ERC20__factory.connect(parentChainTokenAddr, parentProvider) + return ERC20__factory.connect(parentTokenAddr, parentProvider) } /** @@ -470,7 +470,7 @@ export class Erc20Bridger extends AssetBridger< * @param parentProvider * @returns */ - public async getL2ERC20Address( + public async getChildERC20Address( erc20ParentAddress: string, parentProvider: Provider ): Promise { @@ -493,7 +493,7 @@ export class Erc20Bridger extends AssetBridger< * @param childProvider * @returns */ - public async getL1ERC20Address( + public async getParentERC20Address( erc20ChildChainAddress: string, childProvider: Provider ): Promise { @@ -531,12 +531,12 @@ export class Erc20Bridger extends AssetBridger< /** * Whether the token has been disabled on the router - * @param parentChainTokenAddress + * @param parentTokenAddress * @param parentProvider * @returns */ - public async parentChainTokenIsDisabled( - parentChainTokenAddress: string, + public async parentTokenIsDisabled( + parentTokenAddress: string, parentProvider: Provider ): Promise { await this.checkParentChain(parentProvider) @@ -547,7 +547,7 @@ export class Erc20Bridger extends AssetBridger< ) return ( - (await l1GatewayRouter.l1TokenToGateway(parentChainTokenAddress)) === + (await l1GatewayRouter.l1TokenToGateway(parentTokenAddress)) === DISABLED_GATEWAY ) } @@ -733,7 +733,7 @@ export class Erc20Bridger extends AssetBridger< */ public async deposit( params: Erc20DepositParams | ParentToChildTxReqAndSignerProvider - ): Promise { + ): Promise { await this.checkParentChain(params.parentSigner) // Although the types prevent should alert callers that value is not @@ -762,7 +762,7 @@ export class Erc20Bridger extends AssetBridger< ...params.overrides, }) - return ParentChainTransactionReceipt.monkeyPatchContractCallWait(tx) + return ParentTransactionReceipt.monkeyPatchContractCallWait(tx) } /** @@ -875,18 +875,18 @@ export class AdminErc20Bridger extends Erc20Bridger { /** * Register a custom token on the Arbitrum bridge * See https://developer.offchainlabs.com/docs/bridging_assets#the-arbitrum-generic-custom-gateway for more details - * @param parentChainTokenAddress Address of the already deployed l1 token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/ethereum/icustomtoken. + * @param parentTokenAddress Address of the already deployed l1 token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/ethereum/icustomtoken. * @param l2TokenAddress Address of the already deployed l2 token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/arbitrum/iarbtoken. * @param parentSigner The signer with the rights to call registerTokenOnL2 on the l1 token * @param childProvider Arbitrum rpc provider * @returns */ public async registerCustomToken( - parentChainTokenAddress: string, + parentTokenAddress: string, l2TokenAddress: string, parentSigner: Signer, childProvider: Provider - ): Promise { + ): Promise { if (!SignerProviderUtils.signerHasProvider(parentSigner)) { throw new MissingProviderArbSdkError('parentSigner') } @@ -896,7 +896,7 @@ export class AdminErc20Bridger extends Erc20Bridger { const l1SenderAddress = await parentSigner.getAddress() const l1Token = ICustomToken__factory.connect( - parentChainTokenAddress, + parentTokenAddress, parentSigner ) const l2Token = IArbToken__factory.connect(l2TokenAddress, childProvider) @@ -906,9 +906,9 @@ export class AdminErc20Bridger extends Erc20Bridger { await l2Token.deployed() const l1AddressFromL2 = await l2Token.l1Address() - if (l1AddressFromL2 !== parentChainTokenAddress) { + if (l1AddressFromL2 !== parentTokenAddress) { throw new ArbSdkError( - `L2 token does not have l1 address set. Set address: ${l1AddressFromL2}, expected address: ${parentChainTokenAddress}.` + `L2 token does not have l1 address set. Set address: ${l1AddressFromL2}, expected address: ${parentTokenAddress}.` ) } @@ -997,7 +997,7 @@ export class AdminErc20Bridger extends Erc20Bridger { value: setGatewayEstimates2.value, }) - return ParentChainTransactionReceipt.monkeyPatchWait(registerTx) + return ParentTransactionReceipt.monkeyPatchWait(registerTx) } /** @@ -1067,7 +1067,7 @@ export class AdminErc20Bridger extends Erc20Bridger { childProvider: Provider, tokenGateways: TokenAndGateway[], options?: GasOverrides - ): Promise { + ): Promise { if (!SignerProviderUtils.signerHasProvider(parentSigner)) { throw new MissingProviderArbSdkError('parentSigner') } @@ -1112,6 +1112,6 @@ export class AdminErc20Bridger extends Erc20Bridger { value: estimates.estimates.deposit, }) - return ParentChainTransactionReceipt.monkeyPatchContractCallWait(res) + return ParentTransactionReceipt.monkeyPatchContractCallWait(res) } } diff --git a/src/lib/assetBridger/ethBridger.ts b/src/lib/assetBridger/ethBridger.ts index b867861b9b..78b63ff2e1 100644 --- a/src/lib/assetBridger/ethBridger.ts +++ b/src/lib/assetBridger/ethBridger.ts @@ -27,9 +27,9 @@ import { ArbSys__factory } from '../abi/factories/ArbSys__factory' import { ARB_SYS_ADDRESS } from '../dataEntities/constants' import { AssetBridger } from './assetBridger' import { - ParentChainEthDepositTransaction, - ParentChainContractCallTransaction, - ParentChainTransactionReceipt, + ParentEthDepositTransaction, + ParentContractCallTransaction, + ParentTransactionReceipt, } from '../message/ParentTransaction' import { ChildContractTransaction, @@ -76,7 +76,7 @@ export type ApproveGasTokenParamsOrTxRequest = | ApproveGasTokenParams | ApproveGasTokenTxRequest -type WithL1Signer = T & { +type WithParentSigner = T & { parentSigner: Signer } @@ -180,7 +180,7 @@ export class EthBridger extends AssetBridger< */ private isApproveGasTokenParams( params: ApproveGasTokenParamsOrTxRequest - ): params is WithL1Signer { + ): params is WithParentSigner { return typeof (params as ApproveGasTokenTxRequest).txRequest === 'undefined' } @@ -217,7 +217,7 @@ export class EthBridger extends AssetBridger< * @param params */ public async approveGasToken( - params: WithL1Signer + params: WithParentSigner ) { if (this.nativeTokenIsEth) { throw new Error('chain uses ETH as its native/gas token') @@ -286,7 +286,7 @@ export class EthBridger extends AssetBridger< */ public async deposit( params: EthDepositParams | ParentToChildTxReqAndSigner - ): Promise { + ): Promise { await this.checkParentChain(params.parentSigner) const ethDeposit = isParentToChildTransactionRequest(params) @@ -301,7 +301,7 @@ export class EthBridger extends AssetBridger< ...params.overrides, }) - return ParentChainTransactionReceipt.monkeyPatchEthDepositWait(tx) + return ParentTransactionReceipt.monkeyPatchEthDepositWait(tx) } /** @@ -340,7 +340,7 @@ export class EthBridger extends AssetBridger< params: | EthDepositToParams | (ParentToChildTxReqAndSigner & { childProvider: Provider }) - ): Promise { + ): Promise { await this.checkParentChain(params.parentSigner) await this.checkChildChain(params.childProvider) @@ -357,7 +357,7 @@ export class EthBridger extends AssetBridger< ...params.overrides, }) - return ParentChainTransactionReceipt.monkeyPatchContractCallWait(tx) + return ParentTransactionReceipt.monkeyPatchContractCallWait(tx) } /** diff --git a/src/lib/message/ChildToParentMessage.ts b/src/lib/message/ChildToParentMessage.ts index eb5fd4e48e..a6889901a4 100644 --- a/src/lib/message/ChildToParentMessage.ts +++ b/src/lib/message/ChildToParentMessage.ts @@ -233,7 +233,7 @@ export class ChildToParentMessageReader extends ChildToParentMessage { public async status( childChainProvider: Provider ): Promise { - // can we create an ChildToParentmessage here, we need to - the constructor is what we need + // can we create a ChildToParentMessage here, we need to - the constructor is what we need if (this.nitroReader) return await this.nitroReader.status(childChainProvider) else return await this.classicReader!.status(childChainProvider) diff --git a/src/lib/message/ChildToParentMessageNitro.ts b/src/lib/message/ChildToParentMessageNitro.ts index 6fc2e7857e..8c9cb6f102 100644 --- a/src/lib/message/ChildToParentMessageNitro.ts +++ b/src/lib/message/ChildToParentMessageNitro.ts @@ -62,7 +62,7 @@ export type ChildToParentChainMessageReaderOrWriterNitro< // expected number of parent chain blocks that it takes for a Child chain tx to be included in a parent chain assertion const ASSERTION_CREATED_PADDING = 50 -// expected number of parent chain blocks that it takes for a validator to confirm an parent chain block after the node deadline is passed +// expected number of parent chain blocks that it takes for a validator to confirm a parent chain block after the node deadline is passed const ASSERTION_CONFIRMED_PADDING = 20 const childChainBlockRangeCache: { [key in string]: (number | undefined)[] } = diff --git a/src/lib/message/ChildTransaction.ts b/src/lib/message/ChildTransaction.ts index b8f0ca19c2..1f29c13854 100644 --- a/src/lib/message/ChildTransaction.ts +++ b/src/lib/message/ChildTransaction.ts @@ -91,7 +91,7 @@ export class ChildTransactionReceipt implements TransactionReceipt { } /** - * Get an ChildToParentTxEvent events created by this transaction + * Get {@link ChildToParentTransactionEvent} events created by this transaction * @returns */ public getChildToParentEvents(): ChildToParentTransactionEvent[] { diff --git a/src/lib/message/ParentToChildMessageCreator.ts b/src/lib/message/ParentToChildMessageCreator.ts index e075d1f77a..e06a0105ce 100644 --- a/src/lib/message/ParentToChildMessageCreator.ts +++ b/src/lib/message/ParentToChildMessageCreator.ts @@ -7,8 +7,8 @@ import { ParentToChildMessageGasEstimator, } from './ParentToChildMessageGasEstimator' import { - ParentChainContractTransaction, - ParentChainTransactionReceipt, + ParentContractTransaction, + ParentTransactionReceipt, } from './ParentTransaction' import { Inbox__factory } from '../abi/factories/Inbox__factory' import { getChildChain } from '../dataEntities/networks' @@ -208,7 +208,7 @@ export class ParentToChildMessageCreator { }), childProvider: Provider, options?: GasOverrides - ): Promise { + ): Promise { const parentProvider = SignerProviderUtils.getProviderOrThrow( this.parentSigner ) @@ -226,6 +226,6 @@ export class ParentToChildMessageCreator { ...params.overrides, }) - return ParentChainTransactionReceipt.monkeyPatchWait(tx) + return ParentTransactionReceipt.monkeyPatchWait(tx) } } diff --git a/src/lib/message/ParentToChildMessageGasEstimator.ts b/src/lib/message/ParentToChildMessageGasEstimator.ts index 4f2a64d318..a4b5098d34 100644 --- a/src/lib/message/ParentToChildMessageGasEstimator.ts +++ b/src/lib/message/ParentToChildMessageGasEstimator.ts @@ -210,7 +210,7 @@ export class ParentToChildMessageGasEstimator { } /** - * Get gas limit, gas price and submission price estimates for sending an Parent->Child message + * Get gas limit, gas price and submission price estimates for sending a Parent->Child message * @param retryableData Data of retryable ticket transaction * @param parentBaseFee Current parent chain base fee * @param parentProvider @@ -274,7 +274,7 @@ export class ParentToChildMessageGasEstimator { } /** - * Transactions that make an Parent->Child message need to estimate L2 gas parameters + * Transactions that make a Parent->Child message need to estimate L2 gas parameters * This function does that, and populates those parameters into a transaction request * @param dataFunc * @param parentProvider @@ -283,7 +283,7 @@ export class ParentToChildMessageGasEstimator { */ public async populateFunctionParams( /** - * Function that will internally make an Parent->Child transaction + * Function that will internally make a Parent->Child transaction * Will initially be called with dummy values to trigger a special revert containing * the real params. Then called again with the real params to form the final data to be submitted */ diff --git a/src/lib/message/ParentTransaction.ts b/src/lib/message/ParentTransaction.ts index ff0211b9c0..2dd18b0b80 100644 --- a/src/lib/message/ParentTransaction.ts +++ b/src/lib/message/ParentTransaction.ts @@ -48,18 +48,18 @@ import { isDefined } from '../utils/lib' import { SubmitRetryableMessageDataParser } from './messageDataParser' import { getArbitrumNetwork } from '../dataEntities/networks' -export interface ParentChainContractTransaction< - TReceipt extends ParentChainTransactionReceipt = ParentChainTransactionReceipt +export interface ParentContractTransaction< + TReceipt extends ParentTransactionReceipt = ParentTransactionReceipt > extends ContractTransaction { wait(confirmations?: number): Promise } // some helper interfaces to reduce the verbosity elsewhere -export type ParentChainEthDepositTransaction = - ParentChainContractTransaction -export type ParentChainContractCallTransaction = - ParentChainContractTransaction +export type ParentEthDepositTransaction = + ParentContractTransaction +export type ParentContractCallTransaction = + ParentContractTransaction -export class ParentChainTransactionReceipt implements TransactionReceipt { +export class ParentTransactionReceipt implements TransactionReceipt { public readonly to: string public readonly from: string public readonly contractAddress: string @@ -297,59 +297,59 @@ export class ParentChainTransactionReceipt implements TransactionReceipt { } /** - * Replaces the wait function with one that returns an ParentChainTransactionReceipt + * Replaces the wait function with one that returns a {@link ParentTransactionReceipt} * @param contractTransaction * @returns */ public static monkeyPatchWait = ( contractTransaction: ContractTransaction - ): ParentChainContractTransaction => { + ): ParentContractTransaction => { const wait = contractTransaction.wait contractTransaction.wait = async (confirmations?: number) => { const result = await wait(confirmations) - return new ParentChainTransactionReceipt(result) + return new ParentTransactionReceipt(result) } - return contractTransaction as ParentChainContractTransaction + return contractTransaction as ParentContractTransaction } /** - * Replaces the wait function with one that returns an ParentChainEthDepositTransactionReceipt + * Replaces the wait function with one that returns a {@link ParentEthDepositTransactionReceipt} * @param contractTransaction * @returns */ public static monkeyPatchEthDepositWait = ( contractTransaction: ContractTransaction - ): ParentChainEthDepositTransaction => { + ): ParentEthDepositTransaction => { const wait = contractTransaction.wait contractTransaction.wait = async (confirmations?: number) => { const result = await wait(confirmations) - return new ParentChainEthDepositTransactionReceipt(result) + return new ParentEthDepositTransactionReceipt(result) } - return contractTransaction as ParentChainEthDepositTransaction + return contractTransaction as ParentEthDepositTransaction } /** - * Replaces the wait function with one that returns an ParentChainContractCallTransactionReceipt + * Replaces the wait function with one that returns a {@link ParentContractCallTransactionReceipt} * @param contractTransaction * @returns */ public static monkeyPatchContractCallWait = ( contractTransaction: ContractTransaction - ): ParentChainContractCallTransaction => { + ): ParentContractCallTransaction => { const wait = contractTransaction.wait contractTransaction.wait = async (confirmations?: number) => { const result = await wait(confirmations) - return new ParentChainContractCallTransactionReceipt(result) + return new ParentContractCallTransactionReceipt(result) } - return contractTransaction as ParentChainContractCallTransaction + return contractTransaction as ParentContractCallTransaction } } /** - * An ParentChainTransactionReceipt with additional functionality that only exists + * A {@link ParentTransactionReceipt} with additional functionality that only exists * if the transaction created a single eth deposit. */ -export class ParentChainEthDepositTransactionReceipt extends ParentChainTransactionReceipt { +export class ParentEthDepositTransactionReceipt extends ParentTransactionReceipt { /** * Wait for the funds to arrive on the child chain * @param confirmations Amount of confirmations the retryable ticket and the auto redeem receipt should have @@ -383,17 +383,17 @@ export class ParentChainEthDepositTransactionReceipt extends ParentChainTransact } /** - * An ParentChainTransactionReceipt with additional functionality that only exists + * A {@link ParentTransactionReceipt} with additional functionality that only exists * if the transaction created a single call to a child chain contract - this includes * token deposits. */ -export class ParentChainContractCallTransactionReceipt extends ParentChainTransactionReceipt { +export class ParentContractCallTransactionReceipt extends ParentTransactionReceipt { /** * Wait for the transaction to arrive and be executed on the child chain * @param confirmations Amount of confirmations the retryable ticket and the auto redeem receipt should have * @param timeout Amount of time to wait for the retryable ticket to be created * Defaults to 15 minutes, as by this time all transactions are expected to be included on the child chain. Throws on timeout. - * @returns The wait result contains `complete`, a `status`, an ParentToChildMessage and optionally the `childChainTxReceipt`. + * @returns The wait result contains `complete`, a `status`, a {@link ParentToChildMessage} and optionally the `childChainTxReceipt`. * If `complete` is true then this message is in the terminal state. * For contract calls this is true only if the status is REDEEMED. */ diff --git a/tests/integration/customerc20.test.ts b/tests/integration/customerc20.test.ts index 603fb48ccf..297a3819c6 100644 --- a/tests/integration/customerc20.test.ts +++ b/tests/integration/customerc20.test.ts @@ -112,7 +112,7 @@ describe('Custom ERC20', () => { amount: withdrawalAmount, gatewayType: GatewayType.CUSTOM, startBalance: depositAmount, - parentChainToken: ERC20__factory.connect( + parentToken: ERC20__factory.connect( testState.l1CustomToken.address, testState.parentSigner.provider! ), diff --git a/tests/integration/parentToChildMessageCreator.test.ts b/tests/integration/parentToChildMessageCreator.test.ts index 9d1bb7f54a..079ea7ea3c 100644 --- a/tests/integration/parentToChildMessageCreator.test.ts +++ b/tests/integration/parentToChildMessageCreator.test.ts @@ -120,7 +120,7 @@ describe('ParentToChildMessageCreator', () => { // Getting balances const initialChildChainBalance = await childSigner.getBalance() - // In this case, we will try to send directly an ParentToChildTransactionRequest + // In this case, we will try to send directly a ParentToChildTransactionRequest const parentToChildTransactionRequestParams = { from: signerAddress, to: signerAddress, diff --git a/tests/integration/sanity.test.ts b/tests/integration/sanity.test.ts index 88f4ff6380..81e6b9e138 100644 --- a/tests/integration/sanity.test.ts +++ b/tests/integration/sanity.test.ts @@ -171,7 +171,7 @@ describe('sanity checks (read-only)', async () => { const address = hexlify(randomBytes(20)) - const erc20L2AddressAsPerL1 = await erc20Bridger.getL2ERC20Address( + const erc20L2AddressAsPerL1 = await erc20Bridger.getChildERC20Address( address, parentSigner.provider! ) diff --git a/tests/integration/sendChildmsg.test.ts b/tests/integration/sendChildmsg.test.ts index 893ac1c1f8..a00827a73d 100644 --- a/tests/integration/sendChildmsg.test.ts +++ b/tests/integration/sendChildmsg.test.ts @@ -38,14 +38,14 @@ const sendSignedTx = async (testState: any, info?: any) => { } const signedTx = await inbox.signChildChainTx(message, childDeployer) - const l1Tx = await inbox.sendChildChainSignedTx(signedTx) + const parentTx = await inbox.sendChildChainSignedTx(signedTx) return { signedMsg: signedTx, - l1TransactionReceipt: await l1Tx?.wait(), + parentTransactionReceipt: await parentTx?.wait(), } } -describe('Send signedTx to l2 using inbox', async () => { +describe('Send signedTx to child chain using inbox', async () => { // test globals let testState: { parentDeployer: Signer @@ -69,49 +69,47 @@ describe('Send signedTx to l2 using inbox', async () => { value: BigNumber.from(0), } const contractCreationData = Greeter.getDeployTransaction(info) - const { signedMsg, l1TransactionReceipt } = await sendSignedTx( + const { signedMsg, parentTransactionReceipt } = await sendSignedTx( testState, contractCreationData ) - const l1Status = l1TransactionReceipt?.status - expect(l1Status).to.equal(1, 'l1 txn failed') - const l2Tx = ethers.utils.parseTransaction(signedMsg) - const l2Txhash = l2Tx.hash! - const l2TxReceipt = await childDeployer.provider!.waitForTransaction( - l2Txhash + const parentStatus = parentTransactionReceipt?.status + expect(parentStatus).to.equal(1, 'parent txn failed') + const childTx = ethers.utils.parseTransaction(signedMsg) + const childTxhash = childTx.hash! + const childTxReceipt = await childDeployer.provider!.waitForTransaction( + childTxhash ) - const l2Status = l2TxReceipt.status - expect(l2Status).to.equal(1, 'l2 txn failed') + const childStatus = childTxReceipt.status + expect(childStatus).to.equal(1, 'child txn failed') const contractAddress = ethers.ContractFactory.getContractAddress({ - from: l2Tx.from!, - nonce: l2Tx.nonce, + from: childTx.from!, + nonce: childTx.nonce, }) const greeterImp = Greeter.attach(contractAddress) const greetResult = await greeterImp.greet() expect(greetResult).to.equal('hello world', 'contract returns not expected') }) - it('should confirm the same tx on l2', async () => { + it('should confirm the same tx on child chain', async () => { const childDeployer = testState.childDeployer const info = { data: '0x12', to: await childDeployer.getAddress(), } - const { signedMsg, l1TransactionReceipt } = await sendSignedTx( - testState, - info - ) - const l1Status = l1TransactionReceipt?.status - expect(l1Status).to.equal(1) - const l2Txhash = ethers.utils.parseTransaction(signedMsg).hash! - const l2TxReceipt = await childDeployer.provider!.waitForTransaction( - l2Txhash + const { signedMsg, parentTransactionReceipt: parentTransactionReceipt } = + await sendSignedTx(testState, info) + const parentStatus = parentTransactionReceipt?.status + expect(parentStatus).to.equal(1) + const childTxhash = ethers.utils.parseTransaction(signedMsg).hash! + const childTxReceipt = await childDeployer.provider!.waitForTransaction( + childTxhash ) - const l2Status = l2TxReceipt.status - expect(l2Status).to.equal(1) + const childStatus = childTxReceipt.status + expect(childStatus).to.equal(1) }) - it('send two tx share the same nonce but with different gas price, should confirm the one which gas price higher than l2 base price', async () => { + it('send two tx share the same nonce but with different gas price, should confirm the one which gas price higher than child base price', async () => { const childDeployer = testState.childDeployer const currentNonce = await childDeployer.getTransactionCount() @@ -123,28 +121,28 @@ describe('Send signedTx to l2 using inbox', async () => { maxPriorityFeePerGas: BigNumber.from(1000000), //0.001gwei } const lowFeeTx = await sendSignedTx(testState, lowFeeInfo) - const lowFeeL1Status = lowFeeTx.l1TransactionReceipt?.status - expect(lowFeeL1Status).to.equal(1) + const lowFeePARENTStatus = lowFeeTx.parentTransactionReceipt?.status + expect(lowFeePARENTStatus).to.equal(1) const info = { data: '0x12', to: await childDeployer.getAddress(), nonce: currentNonce, } const enoughFeeTx = await sendSignedTx(testState, info) - const enoughFeeL1Status = enoughFeeTx.l1TransactionReceipt?.status - expect(enoughFeeL1Status).to.equal(1) - const l2LowFeeTxhash = ethers.utils.parseTransaction(lowFeeTx.signedMsg) + const enoughFeePARENTStatus = enoughFeeTx.parentTransactionReceipt?.status + expect(enoughFeePARENTStatus).to.equal(1) + const childLowFeeTxhash = ethers.utils.parseTransaction(lowFeeTx.signedMsg) .hash! - const l2EnoughFeeTxhash = ethers.utils.parseTransaction( + const childEnoughFeeTxhash = ethers.utils.parseTransaction( enoughFeeTx.signedMsg ).hash! - const l2TEnoughFeeReceipt = - await childDeployer.provider!.waitForTransaction(l2EnoughFeeTxhash) - const l2Status = l2TEnoughFeeReceipt.status - expect(l2Status).to.equal(1) + const childTEnoughFeeReceipt = + await childDeployer.provider!.waitForTransaction(childEnoughFeeTxhash) + const childStatus = childTEnoughFeeReceipt.status + expect(childStatus).to.equal(1) const res = await childDeployer.provider?.getTransactionReceipt( - l2LowFeeTxhash + childLowFeeTxhash ) expect(res).to.be.null }) diff --git a/tests/integration/standarderc20.test.ts b/tests/integration/standarderc20.test.ts index 11c1e6c1e2..3d15a19f82 100644 --- a/tests/integration/standarderc20.test.ts +++ b/tests/integration/standarderc20.test.ts @@ -268,7 +268,7 @@ describe('standard ERC20', () => { }) it('withdraws erc20', async function () { - const l2TokenAddr = await testState.erc20Bridger.getL2ERC20Address( + const l2TokenAddr = await testState.erc20Bridger.getChildERC20Address( testState.parentToken.address, testState.parentSigner.provider! ) @@ -292,7 +292,7 @@ describe('standard ERC20', () => { amount: withdrawalAmount, gatewayType: GatewayType.STANDARD, startBalance: startBalance, - parentChainToken: ERC20__factory.connect( + parentToken: ERC20__factory.connect( testState.parentToken.address, testState.parentSigner.provider! ), diff --git a/tests/integration/testHelpers.ts b/tests/integration/testHelpers.ts index d27e3f4f23..a2a1c6b5b6 100644 --- a/tests/integration/testHelpers.ts +++ b/tests/integration/testHelpers.ts @@ -57,7 +57,7 @@ interface WithdrawalParams { startBalance: BigNumber amount: BigNumber erc20Bridger: Erc20Bridger - parentChainToken: ERC20 + parentToken: ERC20 childSigner: Signer parentSigner: Signer gatewayType: GatewayType @@ -85,7 +85,7 @@ export const mineUntilStop = async ( export const withdrawToken = async (params: WithdrawalParams) => { const withdrawalParams = await params.erc20Bridger.getWithdrawalRequest({ amount: params.amount, - erc20ParentAddress: params.parentChainToken.address, + erc20ParentAddress: params.parentToken.address, destinationAddress: await params.childSigner.getAddress(), from: await params.childSigner.getAddress(), }) @@ -96,7 +96,7 @@ export const withdrawToken = async (params: WithdrawalParams) => { const withdrawRes = await params.erc20Bridger.withdraw({ destinationAddress: await params.childSigner.getAddress(), amount: params.amount, - erc20ParentAddress: params.parentChainToken.address, + erc20ParentAddress: params.parentToken.address, childSigner: params.childSigner, }) const withdrawRec = await withdrawRes.wait() @@ -112,8 +112,8 @@ export const withdrawToken = async (params: WithdrawalParams) => { ChildToParentMessageStatus.UNCONFIRMED ) - const childChainTokenAddr = await params.erc20Bridger.getL2ERC20Address( - params.parentChainToken.address, + const childChainTokenAddr = await params.erc20Bridger.getChildERC20Address( + params.parentToken.address, params.parentSigner.provider! ) const childChainToken = params.erc20Bridger.getChildTokenContract( @@ -130,7 +130,7 @@ export const withdrawToken = async (params: WithdrawalParams) => { const walletAddress = await params.parentSigner.getAddress() const gatewayAddress = await params.erc20Bridger.getL2GatewayAddress( - params.parentChainToken.address, + params.parentToken.address, params.childSigner.provider! ) @@ -146,16 +146,16 @@ export const withdrawToken = async (params: WithdrawalParams) => { params.childSigner.provider!, gatewayAddress, { fromBlock: withdrawRec.blockNumber, toBlock: 'latest' }, - params.parentChainToken.address, + params.parentToken.address, walletAddress ) expect(gatewayWithdrawEvents.length).to.equal(1, 'token query failed') - const balBefore = await params.parentChainToken.balanceOf( + const balBefore = await params.parentToken.balanceOf( await params.parentSigner.getAddress() ) - // whilst waiting for status we miner on both l1 and l2 + // whilst waiting for status we miner on both parent and child chains const miner1 = Wallet.createRandom().connect(params.parentSigner.provider!) const miner2 = Wallet.createRandom().connect(params.childSigner.provider!) await fundParentSigner(miner1, parseEther('1')) @@ -186,7 +186,7 @@ export const withdrawToken = async (params: WithdrawalParams) => { 'executed status' ).to.eq(ChildToParentMessageStatus.EXECUTED) - const balAfter = await params.parentChainToken.balanceOf( + const balAfter = await params.parentToken.balanceOf( await params.parentSigner.getAddress() ) expect(balBefore.add(params.amount).toString(), 'Not withdrawn').to.eq( @@ -219,7 +219,7 @@ const getGateways = (gatewayType: GatewayType, l2Network: ArbitrumNetwork) => { /** * Deposits a token and tests that it occurred correctly * @param depositAmount - * @param l1TokenAddress + * @param parentTokenAddress * @param erc20Bridger * @param parentSigner * @param childSigner @@ -227,7 +227,7 @@ const getGateways = (gatewayType: GatewayType, l2Network: ArbitrumNetwork) => { export const depositToken = async ({ depositAmount, ethDepositAmount, - l1TokenAddress, + parentTokenAddress, erc20Bridger, parentSigner, childSigner, @@ -238,7 +238,7 @@ export const depositToken = async ({ }: { depositAmount: BigNumber ethDepositAmount?: BigNumber - l1TokenAddress: string + parentTokenAddress: string erc20Bridger: Erc20Bridger parentSigner: Signer childSigner: Signer @@ -249,7 +249,7 @@ export const depositToken = async ({ }) => { await ( await erc20Bridger.approveToken({ - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, parentSigner, }) ).wait() @@ -257,14 +257,14 @@ export const depositToken = async ({ const senderAddress = await parentSigner.getAddress() const expectedParentChainGatewayAddress = await erc20Bridger.getL1GatewayAddress( - l1TokenAddress, + parentTokenAddress, parentSigner.provider! ) - const parentChainToken = erc20Bridger.getParentChainTokenContract( + const parentToken = erc20Bridger.getParentTokenContract( parentSigner.provider!, - l1TokenAddress + parentTokenAddress ) - const allowance = await parentChainToken.allowance( + const allowance = await parentToken.allowance( senderAddress, expectedParentChainGatewayAddress ) @@ -275,7 +275,7 @@ export const depositToken = async ({ await ( await erc20Bridger.approveGasToken({ parentSigner, - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, }) ).wait() @@ -293,12 +293,10 @@ export const depositToken = async ({ ).to.be.true } - const initialBridgeTokenBalance = await parentChainToken.balanceOf( + const initialBridgeTokenBalance = await parentToken.balanceOf( expectedParentChainGatewayAddress ) - const parentTokenBalanceBefore = await parentChainToken.balanceOf( - senderAddress - ) + const parentTokenBalanceBefore = await parentToken.balanceOf(senderAddress) const childChainEthBalanceBefore = await childSigner.provider!.getBalance( destinationAddress || senderAddress ) @@ -306,7 +304,7 @@ export const depositToken = async ({ const depositRes = await erc20Bridger.deposit({ parentSigner, childProvider: childSigner.provider!, - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, amount: depositAmount, retryableGasOverrides: retryableOverrides, maxSubmissionCost: ethDepositAmount, @@ -315,7 +313,7 @@ export const depositToken = async ({ }) const depositRec = await depositRes.wait() - const finalBridgeTokenBalance = await parentChainToken.balanceOf( + const finalBridgeTokenBalance = await parentToken.balanceOf( expectedParentChainGatewayAddress ) expect( @@ -327,9 +325,7 @@ export const depositToken = async ({ ? 0 : initialBridgeTokenBalance.add(depositAmount).toNumber() ) - const parentTokenBalanceAfter = await parentChainToken.balanceOf( - senderAddress - ) + const parentTokenBalanceAfter = await parentToken.balanceOf(senderAddress) expect(parentTokenBalanceAfter.toString(), 'user bal after').to.eq( parentTokenBalanceBefore.sub(depositAmount).toString() ) @@ -343,7 +339,7 @@ export const depositToken = async ({ expect(waitRes.status, 'Unexpected status').to.eq(expectedStatus) if (retryableOverrides) { return { - parentChainToken, + parentToken, waitRes, } } @@ -354,7 +350,7 @@ export const depositToken = async ({ ) const parentChainGateway = await erc20Bridger.getL1GatewayAddress( - l1TokenAddress, + parentTokenAddress, parentSigner.provider! ) expect(parentChainGateway, 'incorrect parent chain gateway address').to.eq( @@ -362,27 +358,27 @@ export const depositToken = async ({ ) const childChainGateway = await erc20Bridger.getL2GatewayAddress( - l1TokenAddress, + parentTokenAddress, childSigner.provider! ) expect(childChainGateway, 'incorrect child chain gateway address').to.eq( expectedL2Gateway ) - const childChainErc20Addr = await erc20Bridger.getL2ERC20Address( - l1TokenAddress, + const childChainErc20Addr = await erc20Bridger.getChildERC20Address( + parentTokenAddress, parentSigner.provider! ) const childChainToken = erc20Bridger.getChildTokenContract( childSigner.provider!, childChainErc20Addr ) - const parentChainErc20Addr = await erc20Bridger.getL1ERC20Address( + const parentChainErc20Addr = await erc20Bridger.getParentERC20Address( childChainErc20Addr, childSigner.provider! ) expect(parentChainErc20Addr).to.equal( - l1TokenAddress, + parentTokenAddress, 'getERC20L1Address/getERC20L2Address failed with proper token address' ) @@ -408,7 +404,7 @@ export const depositToken = async ({ ).to.be.true } - return { parentChainToken, waitRes, childChainToken } + return { parentToken, waitRes, childChainToken } } const fund = async ( diff --git a/tests/integration/weth.test.ts b/tests/integration/weth.test.ts index a11910b602..50c4234991 100644 --- a/tests/integration/weth.test.ts +++ b/tests/integration/weth.test.ts @@ -124,7 +124,7 @@ describeOnlyWhenEth('WETH', async () => { erc20Bridger: erc20Bridger, gatewayType: GatewayType.WETH, parentSigner: parentSigner, - parentChainToken: ERC20__factory.connect( + parentToken: ERC20__factory.connect( childChain.tokenBridge.l1Weth, parentSigner.provider! ), diff --git a/tests/unit/childBlocksForParentBlock.test.ts b/tests/unit/childBlocksForParentBlock.test.ts index 2a3e1deb1a..023e669cc1 100644 --- a/tests/unit/childBlocksForParentBlock.test.ts +++ b/tests/unit/childBlocksForParentBlock.test.ts @@ -2,32 +2,32 @@ import { BigNumber } from 'ethers' import { expect } from 'chai' import { JsonRpcProvider } from '@ethersproject/providers' import { - getBlockRangesForL1Block, - getFirstBlockForL1Block, + getBlockRangesForL1Block as getBlockRangesForParentBlock, + getFirstBlockForL1Block as getFirstBlockForParentBlock, } from '../../src/lib/utils/lib' import { ArbitrumProvider } from '../../src/lib/utils/arbProvider' import { ArbBlock } from '../../src/lib/dataEntities/rpc' -describe('L2 blocks lookup for an L1 block', () => { +describe('Child blocks lookup for a Parent block', () => { const provider = new JsonRpcProvider('https://arb1.arbitrum.io/rpc') const arbProvider = new ArbitrumProvider(provider) - async function validateL2Blocks({ - l2Blocks, - l2BlocksCount, + async function validateChildBlocks({ + childBlocks, + childBlocksCount, type = 'number', }: { - l2Blocks: (number | undefined)[] - l2BlocksCount: number + childBlocks: (number | undefined)[] + childBlocksCount: number type?: 'number' | 'undefined' }) { - if (l2Blocks.length !== l2BlocksCount) { + if (childBlocks.length !== childBlocksCount) { throw new Error( - `Expected L2 block range to have the array length of ${l2BlocksCount}, got ${l2Blocks.length}.` + `Expected Child block range to have the array length of ${childBlocksCount}, got ${childBlocks.length}.` ) } - if (l2Blocks.some(block => typeof block !== type)) { + if (childBlocks.some(block => typeof block !== type)) { throw new Error(`Expected all blocks to be ${type}.`) } @@ -37,14 +37,14 @@ describe('L2 blocks lookup for an L1 block', () => { const promises: Promise[] = [] - l2Blocks.forEach((l2Block, index) => { - if (!l2Block) { - throw new Error('L2 block is undefined.') + childBlocks.forEach((childBlock, index) => { + if (!childBlock) { + throw new Error('Child block is undefined.') } const isStartBlock = index === 0 - promises.push(arbProvider.getBlock(l2Block)) + promises.push(arbProvider.getBlock(childBlock)) // Search for previous or next block. - promises.push(arbProvider.getBlock(l2Block + (isStartBlock ? -1 : 1))) + promises.push(arbProvider.getBlock(childBlock + (isStartBlock ? -1 : 1))) }) const [startBlock, blockBeforeStartBlock, endBlock, blockAfterEndBlock] = @@ -55,48 +55,52 @@ describe('L2 blocks lookup for an L1 block', () => { if (startBlock && blockBeforeStartBlock) { const startBlockCondition = startBlock.gt(blockBeforeStartBlock) - // Check if Arbitrum start block is the first block for this L1 block. + // Check if Arbitrum start block is the first block for this parent block. expect( startBlockCondition, - `L2 block is not the first block in range for L1 block.` + `Child block is not the first block in range for parent block.` ).to.be.true } if (endBlock && blockAfterEndBlock) { const endBlockCondition = endBlock.lt(blockAfterEndBlock) - // Check if Arbitrum end block is the last block for this L1 block. + // Check if Arbitrum end block is the last block for this parent block. expect( endBlockCondition, - `L2 block is not the last block in range for L1 block.` + `Child block is not the last block in range for parent block.` ).to.be.true } } - it('successfully searches for an L2 block range', async function () { - const l2Blocks = await getBlockRangesForL1Block({ + it('successfully searches for an Child block range', async function () { + const childBlocks = await getBlockRangesForParentBlock({ provider: arbProvider, forL1Block: 17926532, // Expected result: 121907680. Narrows down the range to speed up the search. minL2Block: 121800000, maxL2Block: 122000000, }) - await validateL2Blocks({ l2Blocks, l2BlocksCount: 2 }) + await validateChildBlocks({ childBlocks, childBlocksCount: 2 }) }) - it('fails to search for an L2 block range', async function () { - const l2Blocks = await getBlockRangesForL1Block({ + it('fails to search for an Child block range', async function () { + const childBlocks = await getBlockRangesForParentBlock({ provider: arbProvider, forL1Block: 17926533, minL2Block: 121800000, maxL2Block: 122000000, }) - await validateL2Blocks({ l2Blocks, l2BlocksCount: 2, type: 'undefined' }) + await validateChildBlocks({ + childBlocks, + childBlocksCount: 2, + type: 'undefined', + }) }) - it('successfully searches for the first L2 block', async function () { - const l2Blocks = [ - await getFirstBlockForL1Block({ + it('successfully searches for the first Child block', async function () { + const childBlocks = [ + await getFirstBlockForParentBlock({ provider: arbProvider, forL1Block: 17926532, // Expected result: 121907680. Narrows down the range to speed up the search. @@ -104,12 +108,12 @@ describe('L2 blocks lookup for an L1 block', () => { maxL2Block: 122000000, }), ] - await validateL2Blocks({ l2Blocks, l2BlocksCount: 1 }) + await validateChildBlocks({ childBlocks, childBlocksCount: 1 }) }) - it('fails to search for the first L2 block, while not using `allowGreater` flag', async function () { - const l2Blocks = [ - await getFirstBlockForL1Block({ + it('fails to search for the first Child block, while not using `allowGreater` flag', async function () { + const childBlocks = [ + await getFirstBlockForParentBlock({ provider: arbProvider, forL1Block: 17926533, allowGreater: false, @@ -117,12 +121,16 @@ describe('L2 blocks lookup for an L1 block', () => { maxL2Block: 122000000, }), ] - await validateL2Blocks({ l2Blocks, l2BlocksCount: 1, type: 'undefined' }) + await validateChildBlocks({ + childBlocks, + childBlocksCount: 1, + type: 'undefined', + }) }) - it('successfully searches for the first L2 block, while using `allowGreater` flag', async function () { - const l2Blocks = [ - await getFirstBlockForL1Block({ + it('successfully searches for the first Child block, while using `allowGreater` flag', async function () { + const childBlocks = [ + await getFirstBlockForParentBlock({ provider: arbProvider, forL1Block: 17926533, allowGreater: true, @@ -131,6 +139,6 @@ describe('L2 blocks lookup for an L1 block', () => { maxL2Block: 122000000, }), ] - await validateL2Blocks({ l2Blocks, l2BlocksCount: 1 }) + await validateChildBlocks({ childBlocks, childBlocksCount: 1 }) }) }) diff --git a/tests/unit/parentToChildMessageEvents.test.ts b/tests/unit/parentToChildMessageEvents.test.ts index 712359b4ba..a71f707741 100644 --- a/tests/unit/parentToChildMessageEvents.test.ts +++ b/tests/unit/parentToChildMessageEvents.test.ts @@ -1,4 +1,4 @@ -import { ParentChainTransactionReceipt } from './../../src/lib/message/ParentTransaction' +import { ParentTransactionReceipt } from './../../src/lib/message/ParentTransaction' import { BigNumber, constants, providers } from 'ethers' import { JsonRpcProvider } from '@ethersproject/providers' import { expect } from 'chai' @@ -150,12 +150,12 @@ describe('ParentToChildMessage events', () => { } const arbProvider = new JsonRpcProvider('https://arb1.arbitrum.io/rpc') - const parentChainTxnReceipt = new ParentChainTransactionReceipt(receipt) + const parentTxnReceipt = new ParentTransactionReceipt(receipt) let txReceipt try { // Try getting classic messages using a nitro tx - txReceipt = await parentChainTxnReceipt.getParentToChildMessagesClassic( + txReceipt = await parentTxnReceipt.getParentToChildMessagesClassic( arbProvider ) } catch (err) { @@ -172,9 +172,9 @@ describe('ParentToChildMessage events', () => { ).to.be.undefined } - const isClassic = await parentChainTxnReceipt.isClassic(arbProvider) + const isClassic = await parentTxnReceipt.isClassic(arbProvider) const msg = ( - await parentChainTxnReceipt.getParentToChildMessages(arbProvider) + await parentTxnReceipt.getParentToChildMessages(arbProvider) )[0] expect(isClassic, 'incorrect tx type returned by isClassic call').to.be @@ -290,14 +290,12 @@ describe('ParentToChildMessage events', () => { } const arbProvider = new JsonRpcProvider('https://arb1.arbitrum.io/rpc') - const parentChainTxnReceipt = new ParentChainTransactionReceipt(receipt) + const parentTxnReceipt = new ParentTransactionReceipt(receipt) let txReceipt try { // Try getting nitro messages using a classic tx - txReceipt = await parentChainTxnReceipt.getParentToChildMessages( - arbProvider - ) + txReceipt = await parentTxnReceipt.getParentToChildMessages(arbProvider) } catch (err) { // This call should throw an error expect(err).to.be.an('error') @@ -312,9 +310,9 @@ describe('ParentToChildMessage events', () => { ).to.be.undefined } - const isClassic = await parentChainTxnReceipt.isClassic(arbProvider) + const isClassic = await parentTxnReceipt.isClassic(arbProvider) const msg = ( - await parentChainTxnReceipt.getParentToChildMessagesClassic(arbProvider) + await parentTxnReceipt.getParentToChildMessagesClassic(arbProvider) )[0] const status = await msg.status() From 4986a572b4ff401389187b993f7fd2497115ab51 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:31:05 -0400 Subject: [PATCH 02/10] couple more changes in erc20 bridger --- src/lib/assetBridger/erc20Bridger.ts | 62 +++++++++++++++------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/src/lib/assetBridger/erc20Bridger.ts b/src/lib/assetBridger/erc20Bridger.ts index 23442136b3..87e452b07f 100644 --- a/src/lib/assetBridger/erc20Bridger.ts +++ b/src/lib/assetBridger/erc20Bridger.ts @@ -513,7 +513,7 @@ export class Erc20Bridger extends AssetBridger< ) const l1Address = await arbERC20.functions.l1Address().then(([res]) => res) - // check that this l1 address is indeed registered to this l2 token + // check that this l1 address is indeed registered to this child token const l2GatewayRouter = L2GatewayRouter__factory.connect( this.childChain.tokenBridge.l2GatewayRouter, childProvider @@ -727,7 +727,7 @@ export class Erc20Bridger extends AssetBridger< } /** - * Execute a token deposit from parent-to-child + * Execute a token deposit from parent to child chain * @param params * @returns */ @@ -829,7 +829,7 @@ export class Erc20Bridger extends AssetBridger< } /** - * Withdraw tokens from L2 to L1 + * Withdraw tokens from child to parent chain * @param params * @returns */ @@ -875,15 +875,15 @@ export class AdminErc20Bridger extends Erc20Bridger { /** * Register a custom token on the Arbitrum bridge * See https://developer.offchainlabs.com/docs/bridging_assets#the-arbitrum-generic-custom-gateway for more details - * @param parentTokenAddress Address of the already deployed l1 token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/ethereum/icustomtoken. - * @param l2TokenAddress Address of the already deployed l2 token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/arbitrum/iarbtoken. - * @param parentSigner The signer with the rights to call registerTokenOnL2 on the l1 token + * @param parentTokenAddress Address of the already deployed parent token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/ethereum/icustomtoken. + * @param childTokenAddress Address of the already deployed child token. Must inherit from https://developer.offchainlabs.com/docs/sol_contract_docs/md_docs/arb-bridge-peripherals/tokenbridge/arbitrum/iarbtoken. + * @param parentSigner The signer with the rights to call registerTokenOnL2 on the parent token * @param childProvider Arbitrum rpc provider * @returns */ public async registerCustomToken( parentTokenAddress: string, - l2TokenAddress: string, + childTokenAddress: string, parentSigner: Signer, childProvider: Provider ): Promise { @@ -893,22 +893,25 @@ export class AdminErc20Bridger extends Erc20Bridger { await this.checkParentChain(parentSigner) await this.checkChildChain(childProvider) - const l1SenderAddress = await parentSigner.getAddress() + const parentSenderAddress = await parentSigner.getAddress() - const l1Token = ICustomToken__factory.connect( + const parentToken = ICustomToken__factory.connect( parentTokenAddress, parentSigner ) - const l2Token = IArbToken__factory.connect(l2TokenAddress, childProvider) + const childToken = IArbToken__factory.connect( + childTokenAddress, + childProvider + ) // sanity checks - await l1Token.deployed() - await l2Token.deployed() + await parentToken.deployed() + await childToken.deployed() - const l1AddressFromL2 = await l2Token.l1Address() - if (l1AddressFromL2 !== parentTokenAddress) { + const l1AddressFromChildChain = await childToken.l1Address() + if (l1AddressFromChildChain !== parentTokenAddress) { throw new ArbSdkError( - `L2 token does not have l1 address set. Set address: ${l1AddressFromL2}, expected address: ${parentTokenAddress}.` + `L2 token does not have l1 address set. Set address: ${l1AddressFromChildChain}, expected address: ${parentTokenAddress}.` ) } @@ -937,22 +940,25 @@ export class AdminErc20Bridger extends Erc20Bridger { .mul(doubleFeePerGas) .add(setGatewayGas.maxSubmissionCost) - const data = l1Token.interface.encodeFunctionData('registerTokenOnL2', [ - l2TokenAddress, - setTokenGas.maxSubmissionCost, - setGatewayGas.maxSubmissionCost, - setTokenGas.gasLimit, - setGatewayGas.gasLimit, - doubleFeePerGas, - setTokenDeposit, - setGatewayDeposit, - l1SenderAddress, - ]) + const data = parentToken.interface.encodeFunctionData( + 'registerTokenOnL2', + [ + childTokenAddress, + setTokenGas.maxSubmissionCost, + setGatewayGas.maxSubmissionCost, + setTokenGas.gasLimit, + setGatewayGas.gasLimit, + doubleFeePerGas, + setTokenDeposit, + setGatewayDeposit, + parentSenderAddress, + ] + ) return { data, value: setTokenDeposit.add(setGatewayDeposit), - to: l1Token.address, + to: parentToken.address, from, } } @@ -992,7 +998,7 @@ export class AdminErc20Bridger extends Erc20Bridger { ) const registerTx = await parentSigner.sendTransaction({ - to: l1Token.address, + to: parentToken.address, data: setGatewayEstimates2.data, value: setGatewayEstimates2.value, }) From a26b2a17961fe1b11dcb843787d5b81d5fe4f6d2 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:32:27 -0400 Subject: [PATCH 03/10] fix capitalization --- tests/integration/sendChildmsg.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/sendChildmsg.test.ts b/tests/integration/sendChildmsg.test.ts index a00827a73d..1f1d87bbd0 100644 --- a/tests/integration/sendChildmsg.test.ts +++ b/tests/integration/sendChildmsg.test.ts @@ -121,16 +121,16 @@ describe('Send signedTx to child chain using inbox', async () => { maxPriorityFeePerGas: BigNumber.from(1000000), //0.001gwei } const lowFeeTx = await sendSignedTx(testState, lowFeeInfo) - const lowFeePARENTStatus = lowFeeTx.parentTransactionReceipt?.status - expect(lowFeePARENTStatus).to.equal(1) + const lowFeeParentStatus = lowFeeTx.parentTransactionReceipt?.status + expect(lowFeeParentStatus).to.equal(1) const info = { data: '0x12', to: await childDeployer.getAddress(), nonce: currentNonce, } const enoughFeeTx = await sendSignedTx(testState, info) - const enoughFeePARENTStatus = enoughFeeTx.parentTransactionReceipt?.status - expect(enoughFeePARENTStatus).to.equal(1) + const enoughFeeParentStatus = enoughFeeTx.parentTransactionReceipt?.status + expect(enoughFeeParentStatus).to.equal(1) const childLowFeeTxhash = ethers.utils.parseTransaction(lowFeeTx.signedMsg) .hash! const childEnoughFeeTxhash = ethers.utils.parseTransaction( From c64ce689b6e9a14b9ed970144c1eb354fbe1c11b Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:50:33 -0400 Subject: [PATCH 04/10] fix l1tokenaddress --- tests/integration/customerc20.test.ts | 6 +++--- tests/integration/retryableData.test.ts | 8 ++++---- tests/integration/standarderc20.test.ts | 14 +++++++------- tests/integration/weth.test.ts | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/integration/customerc20.test.ts b/tests/integration/customerc20.test.ts index 297a3819c6..eb6b024b7e 100644 --- a/tests/integration/customerc20.test.ts +++ b/tests/integration/customerc20.test.ts @@ -94,7 +94,7 @@ describe('Custom ERC20', () => { ).wait() await depositToken({ depositAmount, - l1TokenAddress: testState.l1CustomToken.address, + parentTokenAddress: testState.l1CustomToken.address, erc20Bridger: testState.adminErc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -123,7 +123,7 @@ describe('Custom ERC20', () => { await depositToken({ depositAmount, ethDepositAmount: utils.parseEther('0.0005'), - l1TokenAddress: testState.l1CustomToken.address, + parentTokenAddress: testState.l1CustomToken.address, erc20Bridger: testState.adminErc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -137,7 +137,7 @@ describe('Custom ERC20', () => { await depositToken({ depositAmount, ethDepositAmount: utils.parseEther('0.0005'), - l1TokenAddress: testState.l1CustomToken.address, + parentTokenAddress: testState.l1CustomToken.address, erc20Bridger: testState.adminErc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, diff --git a/tests/integration/retryableData.test.ts b/tests/integration/retryableData.test.ts index fb55d89e3e..170e4836b4 100644 --- a/tests/integration/retryableData.test.ts +++ b/tests/integration/retryableData.test.ts @@ -153,11 +153,11 @@ describe('RevertData', () => { await testToken.deployed() await (await testToken.mint()).wait() - const l1TokenAddress = testToken.address + const parentTokenAddress = testToken.address await ( await erc20Bridger.approveToken({ - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, parentSigner, }) ).wait() @@ -166,7 +166,7 @@ describe('RevertData', () => { // approve the custom fee token await ( await erc20Bridger.approveGasToken({ - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, parentSigner, }) ).wait() @@ -188,7 +188,7 @@ describe('RevertData', () => { parentSigner, childSignerOrProvider: childSigner.provider!, from: await parentSigner.getAddress(), - erc20ParentAddress: l1TokenAddress, + erc20ParentAddress: parentTokenAddress, amount: depositAmount, retryableGasOverrides: retryableOverrides, } diff --git a/tests/integration/standarderc20.test.ts b/tests/integration/standarderc20.test.ts index 3d15a19f82..af08fc29ca 100644 --- a/tests/integration/standarderc20.test.ts +++ b/tests/integration/standarderc20.test.ts @@ -130,7 +130,7 @@ describe('standard ERC20', () => { await depositToken({ depositAmount, - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -164,7 +164,7 @@ describe('standard ERC20', () => { it('deposit with no funds, manual redeem', async () => { const { waitRes } = await depositToken({ depositAmount, - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -182,7 +182,7 @@ describe('standard ERC20', () => { it('deposit with low funds, manual redeem', async () => { const { waitRes } = await depositToken({ depositAmount, - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -202,7 +202,7 @@ describe('standard ERC20', () => { // redeem transaction const { waitRes } = await depositToken({ depositAmount, - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -234,7 +234,7 @@ describe('standard ERC20', () => { it('deposit with low funds, fails first redeem, succeeds seconds', async () => { const { waitRes } = await depositToken({ depositAmount, - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -303,7 +303,7 @@ describe('standard ERC20', () => { await depositToken({ depositAmount, ethDepositAmount: utils.parseEther('0.0005'), - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, @@ -317,7 +317,7 @@ describe('standard ERC20', () => { await depositToken({ depositAmount, ethDepositAmount: utils.parseEther('0.0005'), - l1TokenAddress: testState.parentToken.address, + parentTokenAddress: testState.parentToken.address, erc20Bridger: testState.erc20Bridger, parentSigner: testState.parentSigner, childSigner: testState.childSigner, diff --git a/tests/integration/weth.test.ts b/tests/integration/weth.test.ts index 50c4234991..1d35219ad2 100644 --- a/tests/integration/weth.test.ts +++ b/tests/integration/weth.test.ts @@ -65,7 +65,7 @@ describeOnlyWhenEth('WETH', async () => { await res.wait() await depositToken({ depositAmount: wethToDeposit, - l1TokenAddress: l1WethAddress, + parentTokenAddress: l1WethAddress, erc20Bridger, parentSigner, childSigner, From bcc13d599249a62ac0bc520b1ae6570f66363002 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:40:39 -0400 Subject: [PATCH 05/10] adds ethers-v6 --- package.json | 5 +++-- yarn.lock | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 47b5fd31f1..e6f75ce896 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "@ethersproject/bignumber": "^5.1.1", "@ethersproject/bytes": "^5.0.8", "async-mutex": "^0.4.0", - "ethers": "^5.1.0" + "ethers": "^5.1.0", + "ethers-v6": "npm:ethers@^6.11.1" }, "devDependencies": { "@arbitrum/nitro-contracts": "^1.1.1", @@ -95,4 +96,4 @@ "resolutions": { "lodash.pick": "https://github.com/lodash/lodash/archive/refs/tags/4.17.21.tar.gz" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index a73034c372..62640aef4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -1057,11 +1062,23 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -1511,6 +1528,11 @@ dependencies: undici-types "~5.26.4" +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/pbkdf2@^3.0.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.1.tgz#c290c1f0d3dc364af94c2c5ee92046a13b7f89fd" @@ -1752,6 +1774,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2896,6 +2923,19 @@ ethereumjs-util@^7.0.3: ethereum-cryptography "^0.1.3" rlp "^2.2.4" +"ethers-v6@npm:ethers@^6.11.1": + version "6.11.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" + integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + ethers@^5.1.0: version "5.6.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" @@ -5358,6 +5398,11 @@ ts-node@^10.2.1: v8-compile-cache-lib "^3.0.0" yn "3.1.1" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -5563,7 +5608,7 @@ undici-types@~5.26.4: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.14.0: - version "5.28.3" + version "5.27.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.0.tgz#789f2e40ce982b5507899abc2c2ddeb2712b4554" integrity sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg== dependencies: @@ -5736,6 +5781,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" From ab7b3103e58a5788268f9d03a96aadc14a7443d1 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:41:00 -0400 Subject: [PATCH 06/10] migrate to ZeroAddress --- scripts/deployStandard.ts | 3 ++- src/lib/assetBridger/assetBridger.ts | 5 ++--- src/lib/inbox/inbox.ts | 7 ++++--- src/lib/message/ParentToChildMessage.ts | 3 ++- src/lib/utils/eventFetcher.ts | 3 ++- .../custom-fee-token/customFeeTokenTestHelpers.ts | 3 ++- tests/integration/customerc20.test.ts | 9 +++++---- 7 files changed, 19 insertions(+), 14 deletions(-) diff --git a/scripts/deployStandard.ts b/scripts/deployStandard.ts index fd66b2b680..78133b305e 100644 --- a/scripts/deployStandard.ts +++ b/scripts/deployStandard.ts @@ -5,6 +5,7 @@ import { constants, BigNumber, utils } from 'ethers' import { MultiCaller } from '../src' import axios from 'axios' import prompt from 'prompts' +import { ZeroAddress } from 'ethers-v6' dotenv.config() const privKey = process.env.PRIVKEY as string @@ -106,7 +107,7 @@ const main = async () => { l1TokenAddress, l1Provider ) - if (l2TokenAddress === constants.AddressZero) { + if (l2TokenAddress === ZeroAddress) { throw new Error(`${l1TokenAddress} can't be bridged`) } diff --git a/src/lib/assetBridger/assetBridger.ts b/src/lib/assetBridger/assetBridger.ts index 2d050c4de7..69a3519411 100644 --- a/src/lib/assetBridger/assetBridger.ts +++ b/src/lib/assetBridger/assetBridger.ts @@ -16,8 +16,6 @@ /* eslint-env node */ 'use strict' -import { constants } from 'ethers' - import { ParentContractTransaction } from '../message/ParentTransaction' import { ChildContractTransaction } from '../message/ChildTransaction' @@ -30,6 +28,7 @@ import { SignerOrProvider, SignerProviderUtils, } from '../dataEntities/signerOrProvider' +import { ZeroAddress } from 'ethers-v6' /** * Base for bridging assets from parent-to-child and back @@ -73,7 +72,7 @@ export abstract class AssetBridger { * @returns {boolean} */ protected get nativeTokenIsEth() { - return !this.nativeToken || this.nativeToken === constants.AddressZero + return !this.nativeToken || this.nativeToken === ZeroAddress } /** diff --git a/src/lib/inbox/inbox.ts b/src/lib/inbox/inbox.ts index a275e95749..3ee2a13af7 100644 --- a/src/lib/inbox/inbox.ts +++ b/src/lib/inbox/inbox.ts @@ -41,6 +41,7 @@ import { NodeInterface__factory } from '../abi/factories/NodeInterface__factory' import { NODE_INTERFACE_ADDRESS } from '../dataEntities/constants' import { InboxMessageKind } from '../dataEntities/message' import { isDefined } from '../utils/lib' +import { ZeroAddress } from 'ethers-v6' type ForceInclusionParams = FetchedEvent & { delayedAcc: string @@ -116,7 +117,7 @@ export class InboxTools { if ( childChainTransactionRequest.to === '0x' || !isDefined(childChainTransactionRequest.to) || - childChainTransactionRequest.to === ethers.constants.AddressZero + childChainTransactionRequest.to === ZeroAddress ) { return true } @@ -141,7 +142,7 @@ export class InboxTools { childChainTransactionRequest ) const gasComponents = await nodeInterface.callStatic.gasEstimateComponents( - childChainTransactionRequest.to || ethers.constants.AddressZero, + childChainTransactionRequest.to || ZeroAddress, contractCreation, childChainTransactionRequest.data, { @@ -419,7 +420,7 @@ export class InboxTools { // however, it is needed when we call to estimateArbitrumGas, so // we add a zero address here. if (!isDefined(tx.to)) { - tx.to = ethers.constants.AddressZero + tx.to = ZeroAddress } //estimate gas on child chain diff --git a/src/lib/message/ParentToChildMessage.ts b/src/lib/message/ParentToChildMessage.ts index 558a9a74c5..9a49a6700b 100644 --- a/src/lib/message/ParentToChildMessage.ts +++ b/src/lib/message/ParentToChildMessage.ts @@ -39,6 +39,7 @@ import { RetryableMessageParams } from '../dataEntities/message' import { getTransactionReceipt, isDefined } from '../utils/lib' import { EventFetcher } from '../utils/eventFetcher' import { ErrorCode, Logger } from '@ethersproject/logger' +import { ZeroAddress } from 'ethers-v6' export enum ParentToChildMessageStatus { /** @@ -152,7 +153,7 @@ export abstract class ParentToChildMessage { formatNumber(maxFeePerGas), formatNumber(gasLimit), // when destAddress is 0x0, arbos treat that as nil - destAddress === ethers.constants.AddressZero ? '0x' : destAddress, + destAddress === ZeroAddress ? '0x' : destAddress, formatNumber(chainCallValue), callValueRefundAddress, formatNumber(maxSubmissionFee), diff --git a/src/lib/utils/eventFetcher.ts b/src/lib/utils/eventFetcher.ts index 67fda1bee2..10b5937160 100644 --- a/src/lib/utils/eventFetcher.ts +++ b/src/lib/utils/eventFetcher.ts @@ -21,6 +21,7 @@ import { Contract, Event } from '@ethersproject/contracts' import { constants } from 'ethers' import { TypedEvent, TypedEventFilter } from '../abi/common' import { EventArgs, TypeChainContractFactory } from '../dataEntities/event' +import { ZeroAddress } from 'ethers-v6' export type FetchedEvent = { event: EventArgs @@ -67,7 +68,7 @@ export class EventFetcher { } ): Promise>[]> { const contract = contractFactory.connect( - filter.address || constants.AddressZero, + filter.address || ZeroAddress, this.provider ) const eventFilter = topicGenerator(contract) diff --git a/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts b/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts index 89abe126fb..f2dc9d8fb5 100644 --- a/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts +++ b/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts @@ -8,6 +8,7 @@ import { } from '../../../scripts/testSetup' import { Erc20Bridger, EthBridger } from '../../../src' import { ERC20__factory } from '../../../src/lib/abi/factories/ERC20__factory' +import { ZeroAddress } from 'ethers-v6' // `config` isn't initialized yet, so we have to wrap these in functions const ethProvider = () => new StaticJsonRpcProvider(config.ethUrl) @@ -16,7 +17,7 @@ const localNetworks = () => getLocalNetworksFromFile() export function isArbitrumNetworkWithCustomFeeToken(): boolean { const nt = localNetworks().l2Network.nativeToken - return typeof nt !== 'undefined' && nt !== ethers.constants.AddressZero + return typeof nt !== 'undefined' && nt !== ZeroAddress } export async function testSetup() { diff --git a/tests/integration/customerc20.test.ts b/tests/integration/customerc20.test.ts index eb6b024b7e..4f1ef259f0 100644 --- a/tests/integration/customerc20.test.ts +++ b/tests/integration/customerc20.test.ts @@ -47,6 +47,7 @@ import { fundParentCustomFeeToken, isArbitrumNetworkWithCustomFeeToken, } from './custom-fee-token/customFeeTokenTestHelpers' +import { ZeroAddress } from 'ethers-v6' const depositAmount = BigNumber.from(100) const withdrawalAmount = BigNumber.from(10) @@ -199,28 +200,28 @@ const registerCustomToken = async ( expect( startL1GatewayAddress, 'Start l1GatewayAddress not equal empty address' - ).to.eq(constants.AddressZero) + ).to.eq(ZeroAddress) const startL2GatewayAddress = await l2GatewayRouter.l1TokenToGateway( l2CustomToken.address ) expect( startL2GatewayAddress, 'Start l2GatewayAddress not equal empty address' - ).to.eq(constants.AddressZero) + ).to.eq(ZeroAddress) const startL1Erc20Address = await l1CustomGateway.l1ToL2Token( l1CustomToken.address ) expect( startL1Erc20Address, 'Start l1Erc20Address not equal empty address' - ).to.eq(constants.AddressZero) + ).to.eq(ZeroAddress) const startL2Erc20Address = await l2CustomGateway.l1ToL2Token( l1CustomToken.address ) expect( startL2Erc20Address, 'Start l2Erc20Address not equal empty address' - ).to.eq(constants.AddressZero) + ).to.eq(ZeroAddress) // send the messages const regTx = await adminErc20Bridger.registerCustomToken( From 882603b73b301d8efdd45742f9d93cd7032c2ff8 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 09:26:53 -0400 Subject: [PATCH 07/10] migrates remaining utils --- src/lib/inbox/inbox.ts | 6 +-- src/lib/message/ParentToChildMessage.ts | 54 ++++++++++--------- .../customFeeTokenEthBridger.test.ts | 6 +-- tests/integration/customerc20.test.ts | 4 +- tests/integration/sendChildmsg.test.ts | 12 ++--- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/lib/inbox/inbox.ts b/src/lib/inbox/inbox.ts index 3ee2a13af7..4eac0b2c8f 100644 --- a/src/lib/inbox/inbox.ts +++ b/src/lib/inbox/inbox.ts @@ -41,7 +41,7 @@ import { NodeInterface__factory } from '../abi/factories/NodeInterface__factory' import { NODE_INTERFACE_ADDRESS } from '../dataEntities/constants' import { InboxMessageKind } from '../dataEntities/message' import { isDefined } from '../utils/lib' -import { ZeroAddress } from 'ethers-v6' +import { ZeroAddress, hexlify, solidityPacked, toBeArray } from 'ethers-v6' type ForceInclusionParams = FetchedEvent & { delayedAcc: string @@ -368,9 +368,9 @@ export class InboxTools { this.parentChainSigner ) - const sendData = ethers.utils.solidityPack( + const sendData = solidityPacked( ['uint8', 'bytes'], - [ethers.utils.hexlify(InboxMessageKind.L2MessageType_signedTx), signedTx] + [hexlify(toBeArray(InboxMessageKind.L2MessageType_signedTx)), signedTx] ) return await delayedInbox.functions.sendL2Message(sendData) diff --git a/src/lib/message/ParentToChildMessage.ts b/src/lib/message/ParentToChildMessage.ts index cd2b7184f0..578aab8b3d 100644 --- a/src/lib/message/ParentToChildMessage.ts +++ b/src/lib/message/ParentToChildMessage.ts @@ -14,14 +14,13 @@ * limitations under the License. */ /* eslint-env node */ -'use strict' +;('use strict') import { TransactionReceipt } from '@ethersproject/providers' import { Provider } from '@ethersproject/abstract-provider' import { Signer } from '@ethersproject/abstract-signer' import { ContractTransaction } from '@ethersproject/contracts' import { BigNumber } from '@ethersproject/bignumber' -import { concat, zeroPad } from '@ethersproject/bytes' import { getAddress } from '@ethersproject/address' import { keccak256 } from '@ethersproject/keccak256' @@ -36,14 +35,22 @@ import { SignerOrProvider, } from '../dataEntities/signerOrProvider' import { ArbSdkError } from '../dataEntities/errors' -import { ethers, Overrides } from 'ethers' +import { Overrides } from 'ethers' import { ChildTransactionReceipt, RedeemTransaction } from './ChildTransaction' import { getChildChain } from '../../lib/dataEntities/networks' import { RetryableMessageParams } from '../dataEntities/message' import { getTransactionReceipt, isDefined } from '../utils/lib' import { EventFetcher } from '../utils/eventFetcher' import { ErrorCode, Logger } from '@ethersproject/logger' -import { ZeroAddress } from 'ethers-v6' +import { + ZeroAddress, + concat, + encodeRlp, + toQuantity, + getBytes, + zeroPadValue, + hexlify, +} from 'ethers-v6' export enum ParentToChildMessageStatus { /** @@ -141,7 +148,7 @@ export abstract class ParentToChildMessage { data: string ): string { const formatNumber = (value: BigNumber): Uint8Array => { - return ethers.utils.stripZeros(value.toHexString()) + return getBytes(hexlify(value.toHexString())) } const chainId = BigNumber.from(chainChainId) @@ -149,7 +156,7 @@ export abstract class ParentToChildMessage { const fields: any[] = [ formatNumber(chainId), - zeroPad(formatNumber(msgNum), 32), + zeroPadValue(formatNumber(msgNum), 32), fromAddress, formatNumber(parentChainBaseFee), @@ -166,12 +173,10 @@ export abstract class ParentToChildMessage { ] // arbitrum submit retry transactions have type 0x69 - const rlpEnc = ethers.utils.hexConcat([ - '0x69', - ethers.utils.RLP.encode(fields), - ]) + const rlpEnc = concat(['0x69', encodeRlp(fields)]) - return ethers.utils.keccak256(rlpEnc) + const hash = keccak256(rlpEnc) + return hash } public static fromEventComponents( @@ -572,22 +577,22 @@ export class ParentToChildMessageReaderClassic { this.retryableCreationId = keccak256( concat([ - zeroPad(BigNumber.from(chainId).toHexString(), 32), - zeroPad(bitFlip(this.messageNumber).toHexString(), 32), + zeroPadValue(BigNumber.from(chainId).toHexString(), 32), + zeroPadValue(bitFlip(this.messageNumber).toHexString(), 32), ]) ) this.autoRedeemId = keccak256( concat([ - zeroPad(this.retryableCreationId, 32), - zeroPad(BigNumber.from(1).toHexString(), 32), + zeroPadValue(this.retryableCreationId, 32), + zeroPadValue(BigNumber.from(1).toHexString(), 32), ]) ) this.chainTxHash = keccak256( concat([ - zeroPad(this.retryableCreationId, 32), - zeroPad(BigNumber.from(0).toHexString(), 32), + zeroPadValue(this.retryableCreationId, 32), + zeroPadValue(BigNumber.from(0).toHexString(), 32), ]) ) } @@ -595,9 +600,9 @@ export class ParentToChildMessageReaderClassic { private calculateChainDerivedHash(retryableCreationId: string): string { return keccak256( concat([ - zeroPad(retryableCreationId, 32), + zeroPadValue(retryableCreationId, 32), // BN 0 meaning Chain TX - zeroPad(BigNumber.from(0).toHexString(), 32), + zeroPadValue(BigNumber.from(0).toHexString(), 32), ]) ) } @@ -770,7 +775,7 @@ export class EthDepositMessage { value: BigNumber ): string { const formatNumber = (numberVal: BigNumber): Uint8Array => { - return ethers.utils.stripZeros(numberVal.toHexString()) + return getBytes(hexlify(numberVal.toHexString())) } const chainId = BigNumber.from(chainChainId) @@ -779,19 +784,16 @@ export class EthDepositMessage { // https://github.com/OffchainLabs/go-ethereum/blob/07e017aa73e32be92aadb52fa327c552e1b7b118/core/types/arb_types.go#L302-L308 const fields = [ formatNumber(chainId), - zeroPad(formatNumber(msgNum), 32), + zeroPadValue(formatNumber(msgNum), 32), getAddress(fromAddress), getAddress(toAddress), formatNumber(value), ] // arbitrum eth deposit transactions have type 0x64 - const rlpEnc = ethers.utils.hexConcat([ - '0x64', - ethers.utils.RLP.encode(fields), - ]) + const rlpEnc = concat(['0x64', encodeRlp(fields)]) - return ethers.utils.keccak256(rlpEnc) + return keccak256(rlpEnc) } /** diff --git a/tests/integration/custom-fee-token/customFeeTokenEthBridger.test.ts b/tests/integration/custom-fee-token/customFeeTokenEthBridger.test.ts index 4ce32939ad..cc53fa7530 100644 --- a/tests/integration/custom-fee-token/customFeeTokenEthBridger.test.ts +++ b/tests/integration/custom-fee-token/customFeeTokenEthBridger.test.ts @@ -17,10 +17,10 @@ 'use strict' import { expect } from 'chai' -import { ethers, constants, Wallet } from 'ethers' +import { constants, Wallet } from 'ethers' import dotenv from 'dotenv' -import { parseEther } from '@ethersproject/units' +import { parseEther } from 'ethers-v6' import { fundParentSigner as fundParentSignerEther, @@ -52,7 +52,7 @@ describeOnlyWhenCustomGasToken( it('approves the custom fee token to be spent by the Inbox on the parent chain (arbitrary amount, using params)', async function () { const { ethBridger, nativeTokenContract, parentSigner } = await testSetup() - const amount = ethers.utils.parseEther('1') + const amount = parseEther('1') await fundParentSignerEther(parentSigner) await fundParentCustomFeeToken(parentSigner) diff --git a/tests/integration/customerc20.test.ts b/tests/integration/customerc20.test.ts index 4f1ef259f0..ccb3134e2b 100644 --- a/tests/integration/customerc20.test.ts +++ b/tests/integration/customerc20.test.ts @@ -47,7 +47,7 @@ import { fundParentCustomFeeToken, isArbitrumNetworkWithCustomFeeToken, } from './custom-fee-token/customFeeTokenTestHelpers' -import { ZeroAddress } from 'ethers-v6' +import { ZeroAddress, parseEther } from 'ethers-v6' const depositAmount = BigNumber.from(100) const withdrawalAmount = BigNumber.from(10) @@ -164,7 +164,7 @@ const registerCustomToken = async ( childChain.tokenBridge.l1GatewayRouter ) await l1CustomToken.deployed() - const amount = ethers.utils.parseEther('1') + const amount = parseEther('1') if (isArbitrumNetworkWithCustomFeeToken()) { const approvalTx = await ERC20__factory.connect( diff --git a/tests/integration/sendChildmsg.test.ts b/tests/integration/sendChildmsg.test.ts index 1f1d87bbd0..2298a71e82 100644 --- a/tests/integration/sendChildmsg.test.ts +++ b/tests/integration/sendChildmsg.test.ts @@ -27,6 +27,7 @@ import { testSetup } from '../../scripts/testSetup' import { greeter } from './helper/greeter' import { expect } from 'chai' import { AdminErc20Bridger } from '../../src/lib/assetBridger/erc20Bridger' +import { Transaction } from 'ethers-v6' const sendSignedTx = async (testState: any, info?: any) => { const { parentDeployer, childDeployer } = testState @@ -75,7 +76,7 @@ describe('Send signedTx to child chain using inbox', async () => { ) const parentStatus = parentTransactionReceipt?.status expect(parentStatus).to.equal(1, 'parent txn failed') - const childTx = ethers.utils.parseTransaction(signedMsg) + const childTx = Transaction.from(signedMsg) const childTxhash = childTx.hash! const childTxReceipt = await childDeployer.provider!.waitForTransaction( childTxhash @@ -101,7 +102,7 @@ describe('Send signedTx to child chain using inbox', async () => { await sendSignedTx(testState, info) const parentStatus = parentTransactionReceipt?.status expect(parentStatus).to.equal(1) - const childTxhash = ethers.utils.parseTransaction(signedMsg).hash! + const childTxhash = Transaction.from(signedMsg).hash! const childTxReceipt = await childDeployer.provider!.waitForTransaction( childTxhash ) @@ -131,11 +132,8 @@ describe('Send signedTx to child chain using inbox', async () => { const enoughFeeTx = await sendSignedTx(testState, info) const enoughFeeParentStatus = enoughFeeTx.parentTransactionReceipt?.status expect(enoughFeeParentStatus).to.equal(1) - const childLowFeeTxhash = ethers.utils.parseTransaction(lowFeeTx.signedMsg) - .hash! - const childEnoughFeeTxhash = ethers.utils.parseTransaction( - enoughFeeTx.signedMsg - ).hash! + const childLowFeeTxhash = Transaction.from(lowFeeTx.signedMsg).hash! + const childEnoughFeeTxhash = Transaction.from(enoughFeeTx.signedMsg).hash! const childTEnoughFeeReceipt = await childDeployer.provider!.waitForTransaction(childEnoughFeeTxhash) From 66fa26b0f94704c3dc7eaca6a0f00c65cc73bbdf Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 12:16:46 -0400 Subject: [PATCH 08/10] fix format issue --- src/lib/inbox/inbox.ts | 2 +- src/lib/message/ParentToChildMessage.ts | 17 +++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/lib/inbox/inbox.ts b/src/lib/inbox/inbox.ts index 4eac0b2c8f..8e269ef817 100644 --- a/src/lib/inbox/inbox.ts +++ b/src/lib/inbox/inbox.ts @@ -18,7 +18,7 @@ import { Signer } from '@ethersproject/abstract-signer' import { Block, Provider } from '@ethersproject/abstract-provider' -import { BigNumber, ContractTransaction, ethers, Overrides } from 'ethers' +import { BigNumber, ContractTransaction, Overrides } from 'ethers' import { TransactionRequest } from '@ethersproject/providers' import { Bridge } from '../abi/Bridge' diff --git a/src/lib/message/ParentToChildMessage.ts b/src/lib/message/ParentToChildMessage.ts index 578aab8b3d..655d039cf2 100644 --- a/src/lib/message/ParentToChildMessage.ts +++ b/src/lib/message/ParentToChildMessage.ts @@ -14,13 +14,14 @@ * limitations under the License. */ /* eslint-env node */ -;('use strict') +'use strict' import { TransactionReceipt } from '@ethersproject/providers' import { Provider } from '@ethersproject/abstract-provider' import { Signer } from '@ethersproject/abstract-signer' import { ContractTransaction } from '@ethersproject/contracts' import { BigNumber } from '@ethersproject/bignumber' +import { concat } from '@ethersproject/bytes' import { getAddress } from '@ethersproject/address' import { keccak256 } from '@ethersproject/keccak256' @@ -42,15 +43,7 @@ import { RetryableMessageParams } from '../dataEntities/message' import { getTransactionReceipt, isDefined } from '../utils/lib' import { EventFetcher } from '../utils/eventFetcher' import { ErrorCode, Logger } from '@ethersproject/logger' -import { - ZeroAddress, - concat, - encodeRlp, - toQuantity, - getBytes, - zeroPadValue, - hexlify, -} from 'ethers-v6' +import { ZeroAddress, toBeArray, encodeRlp, zeroPadValue } from 'ethers-v6' export enum ParentToChildMessageStatus { /** @@ -148,7 +141,7 @@ export abstract class ParentToChildMessage { data: string ): string { const formatNumber = (value: BigNumber): Uint8Array => { - return getBytes(hexlify(value.toHexString())) + return toBeArray(value.toHexString()) } const chainId = BigNumber.from(chainChainId) @@ -775,7 +768,7 @@ export class EthDepositMessage { value: BigNumber ): string { const formatNumber = (numberVal: BigNumber): Uint8Array => { - return getBytes(hexlify(numberVal.toHexString())) + return toBeArray(numberVal.toHexString()) } const chainId = BigNumber.from(chainChainId) From c5b83eb25312f580aae470943b70b994cbfb5836 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:14:32 -0400 Subject: [PATCH 09/10] improve import locations --- src/lib/assetBridger/assetBridger.ts | 2 +- src/lib/inbox/inbox.ts | 2 +- src/lib/message/ParentToChildMessage.ts | 2 +- src/lib/utils/eventFetcher.ts | 3 +-- .../integration/custom-fee-token/customFeeTokenTestHelpers.ts | 4 ++-- tests/integration/customerc20.test.ts | 4 ++-- tests/integration/sendChildmsg.test.ts | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/lib/assetBridger/assetBridger.ts b/src/lib/assetBridger/assetBridger.ts index 69a3519411..bc3f74bcd8 100644 --- a/src/lib/assetBridger/assetBridger.ts +++ b/src/lib/assetBridger/assetBridger.ts @@ -16,6 +16,7 @@ /* eslint-env node */ 'use strict' +import { ZeroAddress } from 'ethers-v6' import { ParentContractTransaction } from '../message/ParentTransaction' import { ChildContractTransaction } from '../message/ChildTransaction' @@ -28,7 +29,6 @@ import { SignerOrProvider, SignerProviderUtils, } from '../dataEntities/signerOrProvider' -import { ZeroAddress } from 'ethers-v6' /** * Base for bridging assets from parent-to-child and back diff --git a/src/lib/inbox/inbox.ts b/src/lib/inbox/inbox.ts index 8e269ef817..a887aa9094 100644 --- a/src/lib/inbox/inbox.ts +++ b/src/lib/inbox/inbox.ts @@ -19,6 +19,7 @@ import { Signer } from '@ethersproject/abstract-signer' import { Block, Provider } from '@ethersproject/abstract-provider' import { BigNumber, ContractTransaction, Overrides } from 'ethers' +import { ZeroAddress, hexlify, solidityPacked, toBeArray } from 'ethers-v6' import { TransactionRequest } from '@ethersproject/providers' import { Bridge } from '../abi/Bridge' @@ -41,7 +42,6 @@ import { NodeInterface__factory } from '../abi/factories/NodeInterface__factory' import { NODE_INTERFACE_ADDRESS } from '../dataEntities/constants' import { InboxMessageKind } from '../dataEntities/message' import { isDefined } from '../utils/lib' -import { ZeroAddress, hexlify, solidityPacked, toBeArray } from 'ethers-v6' type ForceInclusionParams = FetchedEvent & { delayedAcc: string diff --git a/src/lib/message/ParentToChildMessage.ts b/src/lib/message/ParentToChildMessage.ts index 655d039cf2..4b66e7a873 100644 --- a/src/lib/message/ParentToChildMessage.ts +++ b/src/lib/message/ParentToChildMessage.ts @@ -24,6 +24,7 @@ import { BigNumber } from '@ethersproject/bignumber' import { concat } from '@ethersproject/bytes' import { getAddress } from '@ethersproject/address' import { keccak256 } from '@ethersproject/keccak256' +import { ZeroAddress, toBeArray, encodeRlp, zeroPadValue } from 'ethers-v6' import { ArbRetryableTx__factory } from '../abi/factories/ArbRetryableTx__factory' import { @@ -43,7 +44,6 @@ import { RetryableMessageParams } from '../dataEntities/message' import { getTransactionReceipt, isDefined } from '../utils/lib' import { EventFetcher } from '../utils/eventFetcher' import { ErrorCode, Logger } from '@ethersproject/logger' -import { ZeroAddress, toBeArray, encodeRlp, zeroPadValue } from 'ethers-v6' export enum ParentToChildMessageStatus { /** diff --git a/src/lib/utils/eventFetcher.ts b/src/lib/utils/eventFetcher.ts index 10b5937160..b6cc14b4a4 100644 --- a/src/lib/utils/eventFetcher.ts +++ b/src/lib/utils/eventFetcher.ts @@ -18,10 +18,9 @@ import { Provider, BlockTag, Filter } from '@ethersproject/abstract-provider' import { Contract, Event } from '@ethersproject/contracts' -import { constants } from 'ethers' +import { ZeroAddress } from 'ethers-v6' import { TypedEvent, TypedEventFilter } from '../abi/common' import { EventArgs, TypeChainContractFactory } from '../dataEntities/event' -import { ZeroAddress } from 'ethers-v6' export type FetchedEvent = { event: EventArgs diff --git a/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts b/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts index f2dc9d8fb5..ae8e816120 100644 --- a/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts +++ b/tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts @@ -1,5 +1,6 @@ import { StaticJsonRpcProvider } from '@ethersproject/providers' -import { Signer, Wallet, ethers, utils } from 'ethers' +import { Signer, Wallet, utils } from 'ethers' +import { ZeroAddress } from 'ethers-v6' import { testSetup as _testSetup, @@ -8,7 +9,6 @@ import { } from '../../../scripts/testSetup' import { Erc20Bridger, EthBridger } from '../../../src' import { ERC20__factory } from '../../../src/lib/abi/factories/ERC20__factory' -import { ZeroAddress } from 'ethers-v6' // `config` isn't initialized yet, so we have to wrap these in functions const ethProvider = () => new StaticJsonRpcProvider(config.ethUrl) diff --git a/tests/integration/customerc20.test.ts b/tests/integration/customerc20.test.ts index ccb3134e2b..a7a0fd0625 100644 --- a/tests/integration/customerc20.test.ts +++ b/tests/integration/customerc20.test.ts @@ -17,7 +17,8 @@ 'use strict' import { expect } from 'chai' -import { Signer, Wallet, constants, utils, ethers } from 'ethers' +import { Signer, Wallet, utils } from 'ethers' +import { ZeroAddress, parseEther } from 'ethers-v6' import { BigNumber } from '@ethersproject/bignumber' import { Logger, LogLevel } from '@ethersproject/logger' Logger.setLogLevel(LogLevel.ERROR) @@ -47,7 +48,6 @@ import { fundParentCustomFeeToken, isArbitrumNetworkWithCustomFeeToken, } from './custom-fee-token/customFeeTokenTestHelpers' -import { ZeroAddress, parseEther } from 'ethers-v6' const depositAmount = BigNumber.from(100) const withdrawalAmount = BigNumber.from(10) diff --git a/tests/integration/sendChildmsg.test.ts b/tests/integration/sendChildmsg.test.ts index 2298a71e82..bd6e60aef7 100644 --- a/tests/integration/sendChildmsg.test.ts +++ b/tests/integration/sendChildmsg.test.ts @@ -18,6 +18,7 @@ ;('use strict') import { BigNumber, ethers, Signer } from 'ethers' +import { Transaction } from 'ethers-v6' import { InboxTools } from '../../src/lib/inbox/inbox' import { getArbitrumNetwork, @@ -27,7 +28,6 @@ import { testSetup } from '../../scripts/testSetup' import { greeter } from './helper/greeter' import { expect } from 'chai' import { AdminErc20Bridger } from '../../src/lib/assetBridger/erc20Bridger' -import { Transaction } from 'ethers-v6' const sendSignedTx = async (testState: any, info?: any) => { const { parentDeployer, childDeployer } = testState From 9bab0d1b987c7545ca1498e4e0c0df6d697235a5 Mon Sep 17 00:00:00 2001 From: Doug <4741454+douglance@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:49:35 -0400 Subject: [PATCH 10/10] revert undici downgrade in lockfile for audit --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 62640aef4a..4708191674 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5608,7 +5608,7 @@ undici-types@~5.26.4: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.14.0: - version "5.27.0" + version "5.28.3" resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.0.tgz#789f2e40ce982b5507899abc2c2ddeb2712b4554" integrity sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg== dependencies: