Skip to content

fix: Fix vault transaction history and add owner discovery probe - #28

Closed
lndgalante wants to merge 5 commits into
mainfrom
fix/multisig-transaction-history
Closed

lndgalante wants to merge 5 commits into
mainfrom
fix/multisig-transaction-history

Conversation

@lndgalante

@lndgalante lndgalante commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Description

  • Transaction history: Load history from the indexer so older transactions remain visible after fullnode pruning.
  • Indexer and cache fixes: Correct address mappings, add transaction timestamps, and prevent crashes from older cached history.
  • Owner discovery: Add the validated creation-candidate mapping to multisig-mainnet.yaml, with a GraphQL example and integration notes.
  • Follow-up work: Processor deployment and mobile integration will be handled separately.

Test Plan

  • Unit tests: All 62 tests pass, including 20 new regression cases.
  • Checks: Lint, formatting, and YAML mapping checks pass.
  • Mainnet verification: Verified the mapping in the test processor with two known vault creations. The updated production configuration has not been deployed yet.
  • Pending: Full type-check, build, and E2E validation. SDK generation requires valid indexer credentials.

Note

Medium Risk
Changes core vault history data sourcing and indexer schema (including genesis backfill cost for mainnet creation candidates); behavior is covered by new unit tests but processor deployment is not verified in this PR.

Overview
Vault transaction history no longer calls the fullnode per row (fetchCachedTransaction removed). useMultisigExecutionEvents builds rows from indexer multisig_transactions (payload, executor, timestamp, status), normalizes timestamps, paginates with rawCount so filtered rows do not truncate history, and bumps the React Query key to v2 so old array-shaped cache entries are not misread. The GraphQL query adds timestamp; the transactions page and TransactionRow render from ExecutionEvent only (including a “Rejected transaction” label when payload is missing).

Mainnet indexer (multisig-mainnet.yaml) bumps to 0.0.21: maps timestamp and fixes address column types/indexes on existing tables; adds multisig_creation_candidates seeded from FeeStatement events with create_with_owners argument 0 as nullable owners. README documents GraphQL usage, ingestion/backfill cost, and that mobile integration and deployment are still separate.

Testnet YAML gets the same timestamp/address schema fixes without the creation-candidates table. Tests add executionHistory.test.ts (pruned fullnode, timestamp formats, pagination, cache hydration); Vitest enables automatic JSX for component tests.

Reviewed by Cursor Bugbot for commit efa092a. Bugbot is set up for automated code reviews on this repo. Configure here.

maykonmichel and others added 3 commits September 24, 2026 13:12
…ion timestamp

remapping-processor v0.0.21 validates that every event_fields ($.x) target
column is a MoveType. Both multisig_account columns were declared
EventMetadata(AccountAddress) yet are fed by the $.multisig_account payload
field on the modern module events (Vote, AddOwners, RemoveOwners and the
execution events), so the processor crash-looped on boot with "Column
multisig_owner_activities.multisig_account should have a MoveType column_type"
and stopped indexing entirely.

Declare both multisig_account columns as MoveType(Address). The legacy *Event
variants that populate them from account_address metadata stay compatible, since
that metadata is the same underlying address.

Also map the previously-idle transaction_metadata.timestamp hook into a new
multisig_transactions.timestamp column, so execution history can be rendered
straight from the indexer, and bump spec_version to 0.0.21 to match the running
processor.
The history hook re-fetched every transaction from the fullnode via
getTransactionByVersion just to read timestamp and sender: heavy (one full
transaction per row) and broken for aged vaults whose versions the fullnode has
pruned (HTTP 410), which left the whole page blank.

Everything the row renders is already indexed: payload, executor (== the
on-chain sender), status and approval counts. With the new
multisig_transactions.timestamp column the last missing field is covered too, so
the hook now builds execution events directly from the indexer rows — no
fullnode calls — collapsing each page to the single indexer query it already
made and removing the pruning dependency entirely.

TransactionRow renders from the execution event alone; rejected executions carry
no payload, so they fall back to a "Rejected transaction" label. The unused
fetchCachedTransaction action is removed.

Deploy ordering: the indexer processors must be redeployed with the timestamp
column before the web app is built, since graphql-codegen validates the query
against the live indexer schema.
@lndgalante lndgalante self-assigned this Sep 25, 2026
@lndgalante
lndgalante requested a review from a team as a code owner September 25, 2026 17:04
@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
petra-vault-web Error Error Sep 25, 2026 5:19pm UTC

Request Review

This branch had an error being deployed

1 failed deployment
Preview — efa092aa Deployed Sep 25, 2026 by vercel[bot]
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.

2 participants