Skip to content

feat: Implement CrossChainControllerForwardMessageAction basic action (5/10) - #1295

Open
milosh86 wants to merge 2 commits into
app-1065-properly-handle-decoded-actions-for-unverified-contractsfrom
app-1029-implement-crosschaincontroller-action
Open

feat: Implement CrossChainControllerForwardMessageAction basic action (5/10)#1295
milosh86 wants to merge 2 commits into
app-1065-properly-handle-decoded-actions-for-unverified-contractsfrom
app-1029-implement-crosschaincontroller-action

Conversation

@milosh86

@milosh86 milosh86 commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Description

Closes APP-1029.

Implements the forwardMessage basic action for the CrossChainController plugin. The plugin, its types, action
definitions and the GOVERNANCE_PLUGIN_ACTIONS slot registration landed in APP-1064, but the action component itself was
a placeholder rendering null — picking "Forward message" in the action composer produced an empty action body.

The action now renders two inputs and keeps the encoded calldata in sync with them:

  • Destination chain — a RadioGroup built from settings.crossChain.lanes, with the DAO's own chain filtered out
    since a controller cannot forward a message to itself. Each card shows the network name and logo resolved from the
    lane's chain id, falling back to Chain {chainId} for a chain the app doesn't support. When no lane remains after
    filtering, a warning AlertInline explains there is no destination to forward to.
  • Actions — the batch executed on the destination chain, composed through the NestedActionsDialog added in
    APP-1030. Opened with stack: true so closing it doesn't tear down the composer, and with
    excludeActionTypes: [FORWARD_MESSAGE] so a forward action can't be nested into itself.

On every change the component encodes forwardMessage(uint256 _destinationChainId, uint256 _gasLimit, bytes _message)
into the action's data, where _message is the ABI encoding of the OSx Action[] the destination controller hands to
its executor. The three inputData.parameters values are written alongside it so the decoded/raw view stays accurate.

Supporting change: networkUtils.getNetworkByChainId resolves a standard chain id to a Network, which is what lets a
lane be rendered with its network name and logo.

Known limitation: the gas limit is hardcoded to 1,000,000 (TODO(APP-1029)) until product decides between a user
input and a quote derived from the destination chain. The repositoryAddresses in the plugin definition are still zero
addresses from APP-1064, so the plugin is not installable yet — this PR only covers composing the action.

The component asserts action.daoId != null (same pattern as MultisigAddMembersAction): the nested composer resolves
its DAO data from the action, so this view is DAO-context only.

Dependencies: stacked on app-1065-properly-handle-decoded-actions-for-unverified-contractsapp-1064-…
app-1057-…main. Merge the bases first.

Type of Change

  • Minor: Feature (non-breaking change which adds new functionality)

Developer Checklist:

  • Manually smoke tested the functionality in a preview or locally
  • Confirmed there are no new warnings or errors in the browser console
  • (For User Stories only) Double-checked that all Acceptance Criteria are satisfied
  • Confirmed there are no new warnings on automated tests
  • Merged and published any dependent changes in downstream modules
  • Selected the correct base branch
  • Commented the code in hard-to-understand areas
  • Followed the code style guidelines of this project
  • Reviewed that the Files Changed in Github’s UI reflect my intended changes
  • Confirmed the pipeline checks are not failing

Note for reviewers: type-check, lint and the existing networkUtils / nestedActionsDialog suites pass, but the new
component has no unit test of its own yet.

Review Checklist:

  • (For User Stories only) Tested in a preview or locally that all Acceptance Criteria are satisfied
  • Confirmed that changes follow the code style guidelines of this project

Signed-off-by: Milos Dzepina <milos@aragon.org>
@linear-code

linear-code Bot commented Aug 4, 2026

Copy link
Copy Markdown

APP-1029

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

🚀 Preview Deployment: View Here

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

E2E results (preview)

Smoke

Base URL https://app-next-b0l8tqc07-aragon-app.vercel.app
Suite smoke
Playwright result ⚠️ completed with flaky tests
Summary 79 passed, 3 flaky
HTML report View report
GitHub job ✅ completed

View run #4806

Signed-off-by: Milos Dzepina <milos@aragon.org>
@milosh86
milosh86 marked this pull request as ready for review August 4, 2026 16:45
@milosh86
milosh86 requested a review from a team as a code owner August 4, 2026 16:45
@milosh86 milosh86 changed the title feat: Implement CrossChainControllerForwardMessageAction basic action 3/4 feat: Implement CrossChainControllerForwardMessageAction basic action Aug 5, 2026
@milosh86 milosh86 changed the title 3/4 feat: Implement CrossChainControllerForwardMessageAction basic action 5/10 feat: Implement CrossChainControllerForwardMessageAction basic action Aug 5, 2026
@milosh86 milosh86 changed the title 5/10 feat: Implement CrossChainControllerForwardMessageAction basic action feat: Implement CrossChainControllerForwardMessageAction basic action (5/10) Aug 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant