From d6ced031b710ea21b0778195370b8254b61402a8 Mon Sep 17 00:00:00 2001 From: Doug Lance <4741454+douglance@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:34:46 -0400 Subject: [PATCH] feat: adds `getExecuteTx` method to ChildToParentMessageWriter --- .../src/lib/message/ChildToParentMessage.ts | 21 ++++++++++++++- .../message/ChildToParentMessageClassic.ts | 26 ++++++++++++++----- .../lib/message/ChildToParentMessageNitro.ts | 26 ++++++++++++++----- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/packages/sdk/src/lib/message/ChildToParentMessage.ts b/packages/sdk/src/lib/message/ChildToParentMessage.ts index 7ac988d74..85d66b7c2 100644 --- a/packages/sdk/src/lib/message/ChildToParentMessage.ts +++ b/packages/sdk/src/lib/message/ChildToParentMessage.ts @@ -21,7 +21,7 @@ import { Signer } from '@ethersproject/abstract-signer' import { BigNumber } from '@ethersproject/bignumber' import { BlockTag } from '@ethersproject/abstract-provider' -import { ContractTransaction, Overrides } from 'ethers' +import { ContractTransaction, Overrides, PopulatedTransaction } from 'ethers' import { SignerProviderUtils, SignerOrProvider, @@ -316,6 +316,25 @@ export class ChildToParentMessageWriter extends ChildToParentMessageReader { } } + /** + * Gets the execute transaction for the ChildToParentMessage on Parent chain. + * Will throw an error if the outbox entry has not been created, which happens when the + * corresponding assertion is confirmed. + * @returns The populated transaction that can be sent to execute the message + */ + public async getExecuteTransaction( + childProvider: Provider, + overrides?: Overrides + ): Promise { + if (this.nitroWriter) + return this.nitroWriter.getExecuteTransaction(childProvider, overrides) + else + return await this.classicWriter!.getExecuteTransaction( + childProvider, + overrides + ) + } + /** * Executes the ChildToParentMessage on Parent chain. * Will throw an error if the outbox entry has not been created, which happens when the diff --git a/packages/sdk/src/lib/message/ChildToParentMessageClassic.ts b/packages/sdk/src/lib/message/ChildToParentMessageClassic.ts index 368cba35c..038bb5374 100644 --- a/packages/sdk/src/lib/message/ChildToParentMessageClassic.ts +++ b/packages/sdk/src/lib/message/ChildToParentMessageClassic.ts @@ -30,7 +30,7 @@ import { Outbox__factory } from '../abi/classic/factories/Outbox__factory' import { NodeInterface__factory } from '../abi/factories/NodeInterface__factory' import { L2ToL1TransactionEvent as ChildToParentTransactionEvent } from '../abi/ArbSys' -import { ContractTransaction, Overrides } from 'ethers' +import { ContractTransaction, Overrides, PopulatedTransaction } from 'ethers' import { EventFetcher } from '../utils/eventFetcher' import { SignerProviderUtils, @@ -413,15 +413,15 @@ export class ChildToParentMessageWriterClassic extends ChildToParentMessageReade } /** - * Executes the ChildToParentMessage on Parent Chain. + * Gets the execute transaction for the ChildToParentMessage on Parent Chain. * Will throw an error if the outbox entry has not been created, which happens when the * corresponding assertion is confirmed. - * @returns + * @returns The populated transaction that can be sent to execute the message */ - public async execute( + public async getExecuteTransaction( childProvider: Provider, overrides?: Overrides - ): Promise { + ): Promise { const status = await this.status(childProvider) if (status !== ChildToParentMessageStatus.CONFIRMED) { throw new ArbSdkError( @@ -442,7 +442,7 @@ export class ChildToParentMessageWriterClassic extends ChildToParentMessageReade const outbox = Outbox__factory.connect(outboxAddress, this.parentSigner) // We can predict and print number of missing blocks // if not challenged - return await outbox.functions.executeTransaction( + return await outbox.populateTransaction.executeTransaction( this.batchNumber, proofInfo.proof, proofInfo.path, @@ -456,4 +456,18 @@ export class ChildToParentMessageWriterClassic extends ChildToParentMessageReade overrides || {} ) } + + /** + * Executes the ChildToParentMessage on Parent Chain. + * Will throw an error if the outbox entry has not been created, which happens when the + * corresponding assertion is confirmed. + * @returns + */ + public async execute( + childProvider: Provider, + overrides?: Overrides + ): Promise { + const txRequest = await this.getExecuteTransaction(childProvider, overrides) + return await this.parentSigner.sendTransaction(txRequest) + } } diff --git a/packages/sdk/src/lib/message/ChildToParentMessageNitro.ts b/packages/sdk/src/lib/message/ChildToParentMessageNitro.ts index 4f1dd6ae6..83f3159af 100644 --- a/packages/sdk/src/lib/message/ChildToParentMessageNitro.ts +++ b/packages/sdk/src/lib/message/ChildToParentMessageNitro.ts @@ -33,7 +33,7 @@ import { Outbox__factory } from '../abi/factories/Outbox__factory' import { NodeInterface__factory } from '../abi/factories/NodeInterface__factory' import { L2ToL1TxEvent as ChildToParentTxEvent } from '../abi/ArbSys' -import { ContractTransaction, Overrides } from 'ethers' +import { ContractTransaction, Overrides, PopulatedTransaction } from 'ethers' import { Mutex } from 'async-mutex' import { EventFetcher, FetchedEvent } from '../utils/eventFetcher' import { ArbSdkError } from '../dataEntities/errors' @@ -742,15 +742,15 @@ export class ChildToParentMessageWriterNitro extends ChildToParentMessageReaderN } /** - * Executes the ChildToParentMessage on Parent Chain. + * Gets the execute transaction for the ChildToParentMessage on Parent Chain. * Will throw an error if the outbox entry has not been created, which happens when the * corresponding assertion is confirmed. - * @returns + * @returns The populated transaction that can be sent to execute the message */ - public async execute( + public async getExecuteTransaction( childProvider: Provider, overrides?: Overrides - ): Promise { + ): Promise { const status = await this.status(childProvider) if (status !== ChildToParentMessageStatus.CONFIRMED) { throw new ArbSdkError( @@ -764,7 +764,7 @@ export class ChildToParentMessageWriterNitro extends ChildToParentMessageReaderN this.parentSigner ) - return await outbox.executeTransaction( + return await outbox.populateTransaction.executeTransaction( proof, this.event.position, this.event.caller, @@ -777,4 +777,18 @@ export class ChildToParentMessageWriterNitro extends ChildToParentMessageReaderN overrides || {} ) } + + /** + * Executes the ChildToParentMessage on Parent Chain. + * Will throw an error if the outbox entry has not been created, which happens when the + * corresponding assertion is confirmed. + * @returns + */ + public async execute( + childProvider: Provider, + overrides?: Overrides + ): Promise { + const txRequest = await this.getExecuteTransaction(childProvider, overrides) + return await this.parentSigner.sendTransaction(txRequest) + } }