Skip to content

chore: promote staging to production - #569

Open
github-actions[bot] wants to merge 28 commits into
mainfrom
staging
Open

github-actions[bot] wants to merge 28 commits into
mainfrom
staging

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Changes

Warning

This promotion includes a subgraph release. Merging will apply the prod tag on Goldsky and switch pay.filecoin.cloud to the new subgraph version.
Before merging, confirm:

  • The release tracking issue confirms indexing is complete on both networks
  • The Explorer has been smoke-tested on staging against the new subgraph

Auto-generated — merge when staging is validated.

* fix(explorer): one console network source

* refactor(explorer): read permits on dialog chain

* refactor(explorer): fold appConstants into Chain

* test(explorer): cover settlement chain guard

* fix: getChain import

* refactor(explorer): add useConsoleNetwork hook

* docs(explorer): console network and chain rules

* refactor(explorer): keep console network helpers with the console

Move useConsoleNetwork next to the console components, make
getNetworkFromChainId private to it so the AGENTS rule is enforced, and
rename page.tsx's walletNetwork prop to consoleNetwork.

---------

Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com>
* fix(explorer): open the authorize link's form prefilled

A `?authorize=` link now opens the New session key form by itself,
instead of a banner the owner had to click through. Every scope the link
requests starts ticked; a ticked destructive scope shows a warning under
it. The link stays in the URL, so a network or account switch that
remounts the page reopens the form for the wallet now connected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): keep link auto-open off manual forms and renewal scopes

The link's auto-open no longer takes over a form the owner opened by hand
while the listed key's status loaded; that attempt is spent instead.

A renewal keeps the key's previous scopes apart from the link's: a
destructive scope the key held that the link did not request is offered
unticked, and the "Requested by the link" warning only marks scopes the
link actually named.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): stop the authorize link replaying, and keep form edits

- Drop the `?authorize=` link from the URL once its key's login confirms,
  so a reload no longer reopens the form for a key now authorized.
- Drop an authorize link that cannot be used, like a broken revoke link,
  so its error does not come back on every reload.
- Apply the link's prefill once per opening: a key that becomes known
  while the form is open no longer resets what the owner changed.
- Renewal copy no longer claims every previous scope is checked; a held
  destructive scope the link did not request says it can be renewed.
- Name the read-without-stripping hook (`useLinkSearchParams`), and move
  the page's URL tests to Testing Library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): closing the link's form dismisses the link

Closing a form that came from the `?authorize=` link drops the link from
the URL, so a reload does not open it again. A wallet or network switch
remounts the section without closing the form, so the link still
survives that. The success-copy test now changes a checkbox after
submitting, so it proves the copy reads what was sent, not the live form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(explorer): open the authorize link's form prefilled

A `?authorize=` link now opens the New session key form by itself,
instead of a banner the owner had to click through. Every scope the link
requests starts ticked; a ticked destructive scope shows a warning under
it. The link stays in the URL, so a network or account switch that
remounts the page reopens the form for the wallet now connected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(explorer): prefill the key name from an authorize link

An `?authorize=` link may carry `name=`, as the `filecoin` CLI sends it.
The New session key form prefills it in the editable Name field, cleaned
like any other key name. A blank or unusable name is treated as none, never
as a broken link, and a key already in the list keeps its own name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): keep link auto-open off manual forms and renewal scopes

The link's auto-open no longer takes over a form the owner opened by hand
while the listed key's status loaded; that attempt is spent instead.

A renewal keeps the key's previous scopes apart from the link's: a
destructive scope the key held that the link did not request is offered
unticked, and the "Requested by the link" warning only marks scopes the
link actually named.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): stop the authorize link replaying, and keep form edits

- Drop the `?authorize=` link from the URL once its key's login confirms,
  so a reload no longer reopens the form for a key now authorized.
- Drop an authorize link that cannot be used, like a broken revoke link,
  so its error does not come back on every reload.
- Apply the link's prefill once per opening: a key that becomes known
  while the form is open no longer resets what the owner changed.
- Renewal copy no longer claims every previous scope is checked; a held
  destructive scope the link did not request says it can be renewed.
- Name the read-without-stripping hook (`useLinkSearchParams`), and move
  the page's URL tests to Testing Library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(explorer): cover the link's name through the review fixes

A broken authorize link drops its `name` with it, and a name the owner
typed survives the key becoming known while the form is open. The test's
Input mock hands onChange the value, like the real component.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): closing the link's form dismisses the link

Closing a form that came from the `?authorize=` link drops the link from
the URL, so a reload does not open it again. A wallet or network switch
remounts the section without closing the form, so the link still
survives that. The success-copy test now changes a checkbox after
submitting, so it proves the copy reads what was sent, not the live form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): fill in the link's name for an unnamed existing key

An unnamed key has name "", which `!= null` treated as a name to keep, so
re-authorizing a key the CLI created ignored the link's `name`. An empty
name now counts as none and the link's suggestion fills in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…nk (#572)

* fix(explorer): open the authorize link's form prefilled

A `?authorize=` link now opens the New session key form by itself,
instead of a banner the owner had to click through. Every scope the link
requests starts ticked; a ticked destructive scope shows a warning under
it. The link stays in the URL, so a network or account switch that
remounts the page reopens the form for the wallet now connected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(explorer): prefill the key name from an authorize link

An `?authorize=` link may carry `name=`, as the `filecoin` CLI sends it.
The New session key form prefills it in the editable Name field, cleaned
like any other key name. A blank or unusable name is treated as none, never
as a broken link, and a key already in the list keeps its own name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): keep link auto-open off manual forms and renewal scopes

The link's auto-open no longer takes over a form the owner opened by hand
while the listed key's status loaded; that attempt is spent instead.

A renewal keeps the key's previous scopes apart from the link's: a
destructive scope the key held that the link did not request is offered
unticked, and the "Requested by the link" warning only marks scopes the
link actually named.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(explorer): set session key expiry in days, prefilled from the link

The create form's expiry is one number of days (default 30, any whole
number from 1 up to the last date a JS Date holds) in place of the
7/30/90 presets and the custom date picker; it shows the date the key
stops working. An `?authorize=` link's `days=` prefills it, and like
`name`, unusable days are ignored rather than refusing the link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): stop the authorize link replaying, and keep form edits

- Drop the `?authorize=` link from the URL once its key's login confirms,
  so a reload no longer reopens the form for a key now authorized.
- Drop an authorize link that cannot be used, like a broken revoke link,
  so its error does not come back on every reload.
- Apply the link's prefill once per opening: a key that becomes known
  while the form is open no longer resets what the owner changed.
- Renewal copy no longer claims every previous scope is checked; a held
  destructive scope the link did not request says it can be renewed.
- Name the read-without-stripping hook (`useLinkSearchParams`), and move
  the page's URL tests to Testing Library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(explorer): cover the link's name through the review fixes

A broken authorize link drops its `name` with it, and a name the owner
typed survives the key becoming known while the form is open. The test's
Input mock hands onChange the value, like the real component.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): resolve the expiry once per render, take days as text

The shown date and the Authorize check now use one resolved expiry per
render; submitting still reads the clock fresh. The days field is a text
input with a numeric keyboard: a number input took `1e2` or `7.0` as
valid while the form refused them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): closing the link's form dismisses the link

Closing a form that came from the `?authorize=` link drops the link from
the URL, so a reload does not open it again. A wallet or network switch
remounts the section without closing the form, so the link still
survives that. The success-copy test now changes a checkbox after
submitting, so it proves the copy reads what was sent, not the live form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): fill in the link's name for an unnamed existing key

An unnamed key has name "", which `!= null` treated as a name to keep, so
re-authorizing a key the CLI created ignored the link's `name`. An empty
name now counts as none and the link's suggestion fills in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): tie the days field to its validation message

The days field sets aria-invalid when the days cannot be used and points
aria-describedby at the line under it, which says the expiry date or why
it is refused. It is a native input: the library Input overwrites both
attributes outside a Field. The e2e spec checks them in a real browser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): cap the days an authorize link may suggest at 365

A link's `days=` is capped at 365, matching the `filecoin` CLI's `--days`,
so a link alone cannot ask for a longer expiry. A link asking for more
prefills 365; the owner can still type a longer expiry in the form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…574)

* feat(explorer): open Add Service from an approval-only funding link

A funding link no longer needs a deposit: `/console?operator=fwss&network=<net>`
opens Add Service with Warm Storage filled in and the deposit empty, so an
account that only needs the approval gets it in one step. A `deposit` the
link names but that cannot be read (empty, zero, junk) still refuses the
whole link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(explorer): accept a curated Warm Storage pick in the approval-link e2e

Real mode's subgraph lists Warm Storage, so the dialog selects it by name
and links its contract instead of filling the custom-address field. The
spec now accepts either, and still requires an empty deposit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): don't reopen an approval Warm Storage already has

An approval-only funding link now reads the account's Warm Storage
approval first. If it is already approved, the console says so instead
of opening Add a Service, whose unlimited defaults would overwrite the
owner's own limits. A failed read still opens the dialog for review.
The e2e fake chain answers `operatorApprovals`, approved only for the
operators a spec lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): settle the approval check once, without retries

An approval-only link now decides from the first answer for this wallet
and network and stops reading: approving through the dialog refetches the
read, which used to flip the page to "already approved" right after the
owner approved. A failed read no longer retries, since it opens the
dialog anyway. New Testing Library cases cover reading, approved, not
approved, a failed read and the refetch after approving.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat(explorer): one /console/setup page for CLI links

CLI links for a session key, the Warm Storage approval and a deposit used
to land on two pages: /console/session-keys?authorize= and
/console?deposit=. They now open one consent-style page, /console/setup,
that lists what the link asks for as steps with live status read from
the chain: authorize the key, approve Warm Storage, fund Filecoin Pay.

- The link decides what counts as done: `approval=unlimited` requires
  allowances without limits, `deposit` is an amount to add on top, and
  `balance` is the target the funds step checks.
- Approving deposits in the same transaction when the wallet holds the
  shortfall; otherwise the funds step offers Deposit or Add funds.
- The old links redirect in proxy.ts; `?revoke=` stays on Session keys.
- The console shell moves to app/console/_shell, shared by both route
  groups; the setup group drops the sidebar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): address setup page review feedback

- Add a Service ignores a deposit amount left in a field that
  `withoutDeposit` hid while the form was open.
- A `balance` target counts the account's debt: a deposit settles it
  before any of it becomes available.
- A `deposit` link offers nothing until its starting balance is read, so a
  deposit sent before then is not asked for again.
- The setup steps remount when the link changes, so one link's baseline and
  reached funds do not carry over to the next.

The e2e specs that open deposit links now answer the subgraph as an empty
account (e2e/subgraph.ts), since an unread balance no longer offers a deposit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): read setup funds from the chain, retry an unread approval

The setup page decides what to offer from live chain state, but read
Filecoin Pay from the subgraph. While the subgraph lagged, an approval
that also deposited showed "Deposit 2 USDFC" again, and the Deposit
button stayed clickable after its deposit landed.

- One batched read at one block now gives the steps Filecoin Pay's
  `accounts(USDFC, owner)`, the wallet's USDFC and the epoch; available
  balance and debt are rolled forward from it (matches the contract's
  getAccountInfoIfSettled). A deposit counts as soon as its receipt lands.
- A `deposit` link measures the account's `funds` from where they stood
  when the page opened. A rail settled during the visit can only make it
  ask for more, never count a deposit that did not happen.
- The subgraph now only fills in the Deposit dialog's token picker, so the
  e2e empty-subgraph helper is gone.
- An approval that could not be read offers Retry instead of Add a
  Service, and the funds step waits for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(explorer): refresh batched contract reads after a receipt

invalidateAccountQueries refreshed ["readContract"], but wagmi keys
batched reads ["readContracts", …] and TanStack matches whole key
elements. The setup page's Filecoin Pay and wallet USDFC read waited up
to one 15s poll after a receipt, so "Approve and deposit" or "Deposit"
could offer the same deposit again in the meantime. The key-grant and
session-key status reads now get the receipt refresh too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* chore(explorer): drop dead console code and logs

* refactor(explorer): check Privy app at build

* fix(explorer): explain blocked deposit and withdraw

* refactor(explorer): simplify deposit and withdraw
Treat utm_source=filecoin-cli as a product label, the same as
filecoin-pin, by checking against a set of known CLI sources.

Refs #576

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* chore(subgraph): sync abis from @filoz/synapse-core

* chore: address pr review comments

* chore: install deps

* fix: restore staging lockfile
* feat(explorer): console data sets table

* fix: correct network and monthly spend calculation

* fix(explorer): hide deleted data sets

* refactor(explorer): simplify data sets table

* fix(explorer): address data sets review
* fix(explorer): price FIL top-up from Sushi pool

* refactor(explorer): simplify FIL top-up pricing
…565)

Since dialogs moved to Headless UI (#548), real Privy marks the page
behind its modal aria-hidden and inert, so role queries miss the console
dialog while the wallet is open. Two cli-newcomer specs failed only in
real mode for that reason; the flow itself works (the key registers and
the console is usable after All Done). Query with includeHidden.
…ze (#609)

A filecoin-pin login link that asks for encrypted uploads now carries `pubkey` (the session key's Keysmith key-agreement key) and `pubkeysig` (the session key's EIP-191 signature over it). Setup adds a "Give this key access to encrypted uploads" step after the session key step.

- The link parser reads and validates both params. `pubkey` must be `0x04` + 128 lowercase hex and comes with `authorize`. `pubkeysig` must recover to the session key before any wallet request.
- The step picks the group key using filecoin-pin's rule: group the owner's live data sets by `foc/ks`, skip inconsistent or non-canonical groups, and take the group with the lowest data set id. If there is none, it uses the default id.
- The step asks the wallet to sign and returns an `fgr1_` Grant, wrapped to the session key with @filoz/keysmith. The Grant is shown read-only with a copy button. It is never stored or sent, and setup is complete only once it is made.
- The data set scan reads only liveness and metadata, once per page load.
- Problems with the group key show before the session key is authorized. 
- The wallet error helpers move from the Squid module to `src/utils/walletErrors.ts`.

Adds @filoz/keysmith ^0.1.0.
@socket-security

socket-security Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​filoz/​keysmith@​0.1.07710010090100

View full report

* fix(explorer): clarify wallet setup button for new users

* fix(explorer): use inclusive email and Google login copy
* feat(explorer): stale data set triage queue

* fix: ask mute time + resolve client side queue pagination

* feat(notification-service): keep mute data sets

* refactor: extract ExpiryPicker to reuse

* fix(explorer): clarify stale queue cap note

* fix(explorer): hide Keep when mutes fail to load

* fix(explorer): explain a rejected mute date

* test(notification-service): pin 367-day mute cap

* refactor(explorer): simplify stale data set queue

* refactor: share the wallet query schema

* fix(explorer): hide Keep off a Filecoin chain

* refactor(explorer): share the notifications client

* perf(notification-service): index active mutes

* test(explorer): type the notifications fetch mock

* fix(explorer): round stale spend with shared helper

* fix(explorer): read mutes off a Filecoin chain

* refactor(explorer): fold ExpiryPicker into dialog

* refactor(explorer): always watch the stale epoch
* feat: inactive dataset email

* refactor: simplify inactivity email

* fix: match email spend and test deep link
* fix: clarify the group key step copy

* style: widen setup step descriptions and recolour statuses

This branch was successfully deployed

1 active deployment
Preview — ab79e029 Deployed Oct 31, 2026 by BravoNatalie via Deploy #369
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.

6 participants