| type | Feature |
|---|---|
| title | Replace InvoiceCard inline amount, date, and yield formatters with the shared lib/format helpers |
| labels | type:refactor, area:invoice-card, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN |
| assignees |
components/InvoiceCard.jsx defines its own formatDate, formatAmount, and formatYield functions, while a canonical, well-tested implementation already exists in lib/format/currency.js. Worse, the card body renders the yield with a hand-rolled `${yieldPct}%` expression that bypasses even its own formatYield, so a string like "8.5%" becomes "8.5%%". Consolidate on the shared helpers so formatting stays consistent across the card, skeleton, and detail page.
- Repository scope: Liquifact/Liquifact-frontend only.
- Import
formatCurrency/formatAmountfromlib/format/currency.jsand use them for the amount and yield cells. - Delete the duplicated local
formatAmount/formatYield; keep date formatting only if no shared date helper exists, otherwise reuse it. - Fix the
`${yieldPct}%`render so a percent-suffixed string is never double-suffixed. - Preserve existing markup, column widths, and the
aria-labelcomposition.
- Fork the repo and create a branch
git checkout -b refactor/invoice-card-shared-formatters- Implement changes
- Write code in:
components/InvoiceCard.jsx, reusinglib/format/currency.js - Write comprehensive tests in:
components/InvoiceCard.test.tsx - Add documentation: note the formatter reuse in
COMPONENTS.md - Validate security/a11y: ensure values stay escaped and the visible text matches the
aria-label.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases:
null/NaNamount, numeric vs percent-string yield, and a missingdueDate.
refactor: render InvoiceCard via shared lib/format helpers with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Detect and block funding when Freighter is on an unexpected Stellar network" labels: type:security, area:wallet, stack:nextjs, stack:react, stack:typescript, priority:high, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
lib/wallet/freighter.js reads the wallet network via getFreighterNetwork() but silently defaults to 'public' on any error and never compares it against the app's configured NEXT_PUBLIC_STELLAR_NETWORK. A user connected to mainnet while the app targets testnet (or vice versa) could attempt a funding action against the wrong ledger. Add an explicit network-match check and surface a clear wrong-network state.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add
assertExpectedNetwork()/isExpectedNetwork()inlib/wallet/freighter.jscomparinggetFreighterNetwork()againstNEXT_PUBLIC_STELLAR_NETWORK. - Do not default-to-
publicon error in a way that masks a mismatch; treat an unreadable network as not-expected. - Wire the result into the existing
WRONG_NETWORKwallet state consumed bycomponents/WalletStatus.jsx. - Never trigger a funding request while the network is unexpected.
- Fork the repo and create a branch
git checkout -b security/wallet-expected-network-guard- Implement changes
- Write code in:
lib/wallet/freighter.js,components/WalletStatus.jsx - Write comprehensive tests in:
lib/wallet/freighter.test.tsx - Add documentation: update
WALLET_INTEGRATION_CONTRACT.md - Validate security/a11y: confirm wrong-network blocks actions and the state is announced to assistive tech.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: matching network, mismatched network, and a thrown
getNetworkDetails.
security: block funding on unexpected Freighter network with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add an AbortController-based request timeout to fetchInvestableInvoices" labels: type:enhancement, area:api-client, stack:nextjs, stack:react, stack:typescript, priority:high, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
lib/api/invoices.js issues a bare fetch with no timeout, so a hung backend leaves the Invest marketplace spinning indefinitely. The existing getHealth path already models timeout handling; bring the same resilience to the invoices client by adding a configurable timeout that aborts the request and throws a typed timeout error, while still honoring a caller-supplied signal.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add a
timeoutMsoption (sensible default) tofetchInvestableInvoicesand abort viaAbortController, composing with any callersignal. - Throw a distinguishable timeout error so the marketplace can show a retryable banner.
- Preserve existing not-OK, invalid-JSON, and non-array error paths and the field normalization.
- Fork the repo and create a branch
git checkout -b enhancement/api-client-invoices-timeout- Implement changes
- Write code in:
lib/api/invoices.js - Write comprehensive tests in:
lib/api/invoices.test.ts - Add documentation: update
docsdata-fetching notes - Validate security/a11y: ensure aborted requests do not leak state and errors are user-safe.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: timeout fired, caller-abort, OK response, and non-array payload.
feat: add request timeout to fetchInvestableInvoices with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add a status-legend filter chip row to the Invest marketplace using StatusPill tones" labels: type:feature, area:marketplace, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
The Invest marketplace renders invoice statuses through components/StatusPill.jsx but offers no way to filter the list by status. Add a compact, toggleable chip row above the list that lets investors narrow results to one or more statuses, reusing the canonical vocabulary and tones from lib/types/invoice.js.
- Repository scope: Liquifact/Liquifact-frontend only.
- Derive the chip set from
INVOICE_STATUSESso it never drifts from the pill mapping. - Toggling a chip filters the visible invoices; multiple selections union together; clearing shows all.
- Each chip is a real
buttonwitharia-pressed; selection is keyboard operable. - Integrate with the existing filter/derivation flow in
app/invest/page.jswithout breaking search.
- Fork the repo and create a branch
git checkout -b feature/marketplace-status-legend-filter- Implement changes
- Write code in:
app/invest/page.js,components/InvoiceFilters.jsx - Write comprehensive tests in:
components/InvoiceFilters.test.jsx - Add documentation: update
COMPONENTS.md - Validate security/a11y: verify
aria-pressedsemantics and visible focus.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: no selection, single status, multi-status union, and an unknown status value.
feat: add status-legend filter chips to the marketplace with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add a print stylesheet so investors can print or PDF an invoice detail page" labels: type:feature, area:invoice-detail, stack:nextjs, stack:react, stack:typescript, priority:low, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
The invoice detail route app/invest/[id]/page.js is built for the dark on-screen theme and prints poorly: dark backgrounds waste ink and interactive chrome (wallet button, nav) appears on paper. Add a print stylesheet and a "Print / Save PDF" action so investors can produce a clean record of an invoice.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add
@media printrules inapp/globals.cssthat hide nav/wallet/footer chrome and switch to a light, ink-friendly layout. - Add a "Print" button on the detail page that calls
window.print(). - Keep the printed output to the invoice's core fields (issuer, amount, yield, maturity, status).
- Fork the repo and create a branch
git checkout -b feature/invoice-detail-print-stylesheet- Implement changes
- Write code in:
app/invest/[id]/page.js,app/globals.css - Write comprehensive tests in:
app/invest/[id]/page.test.tsx - Add documentation: note the print behavior in
COMPONENTS.md - Validate security/a11y: ensure the print button is labeled and reachable by keyboard.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: print button invokes
window.print, and chrome is marked no-print.
feat: add print stylesheet and print action to invoice detail with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Document every NEXT_PUBLIC_ and Stellar environment variable in a single reference" labels: type:docs, area:configuration, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
Environment variables are referenced across lib/api/invoices.js, app/sitemap.js, lib/wallet/freighter.js, and lib/config/env.js, and .env.local.example lists a subset, but there is no single authoritative table explaining each variable, its default, and which feature breaks without it. Add a configuration reference and reconcile it against .env.local.example.
- Repository scope: Liquifact/Liquifact-frontend only.
- Produce a
docs/configuration.mdtable: variable, purpose, default, required-vs-optional, consuming module. - Cover
NEXT_PUBLIC_API_URL,NEXT_PUBLIC_SITE_URL, andNEXT_PUBLIC_STELLAR_NETWORKat minimum; audit the code for any others. - Ensure
.env.local.examplematches the documented set exactly (no orphans either way).
- Fork the repo and create a branch
git checkout -b docs/configuration-env-reference- Implement changes
- Write code in: documentation only; reconcile
.env.local.example - Write comprehensive tests in:
lib/config/env.test.tsx(assert documented defaults matchlib/config/env.js) - Add documentation: add
docs/configuration.mdand link it fromREADME.md - Validate security/a11y: confirm no secrets are documented as public env vars.
- Write code in: documentation only; reconcile
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: missing optional var falls back to its documented default.
docs: add environment-variable configuration reference and reconcile example
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Announce wallet connect and disconnect transitions through a polite live region" labels: type:a11y, area:wallet, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
components/WalletStatus.jsx changes its visible label as the wallet moves between disconnected, connecting, connected, and error states, but a screen-reader user gets no spoken confirmation when a connection completes or drops. Add a dedicated polite live region that announces each meaningful transition once.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add an
aria-live="polite"status region that announces transitions (e.g., "Wallet connected", "Wallet disconnected", "Wallet connection failed"). - Announce only on actual state change; avoid repeated or duplicate announcements on re-render.
- Do not announce the full public key; keep announcements concise and non-sensitive.
- Build on the existing
WALLET_STATES/state machine incomponents/WalletContext.jsx.
- Fork the repo and create a branch
git checkout -b a11y/wallet-status-live-announcements- Implement changes
- Write code in:
components/WalletStatus.jsx - Write comprehensive tests in:
components/WalletStatus.test.tsx - Add documentation: update
WALLET_INTEGRATION_CONTRACT.md - Validate security/a11y: run
jest-axeand verify single-announcement-per-transition behavior.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: connect, disconnect, error, and a no-op re-render.
a11y: announce wallet connection transitions via live region with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add unit tests for the lib/format/invoice formatAmount and formatYield helpers" labels: type:test, area:formatting, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
lib/format/invoice.js exposes formatAmount and formatYield, but the helpers have thin coverage and contain a latent quirk: formatAmount accepts a currency argument that it then ignores, and formatYield blindly interpolates without guarding null/NaN. Lock the current contract down with tests so any future change (or the noted cleanups) is intentional.
- Repository scope: Liquifact/Liquifact-frontend only.
- Test
formatAmountgrouping output, zero, negative, and the currently-ignoredcurrencyparameter. - Test
formatYieldfor integers, decimals, and document behavior onnull/undefined/NaN. - Keep tests deterministic across locales by asserting on structure, not a hard-coded separator where the platform may vary.
- Fork the repo and create a branch
git checkout -b test/format-invoice-helpers- Implement changes
- Write code in: test-only; optionally add
null/NaNguards tolib/format/invoice.jsif it tightens the contract - Write comprehensive tests in:
lib/format/invoice.test.tsx - Add documentation: note the helper contract in
COMPONENTS.md - Validate security/a11y: ensure output is plain display-safe text.
- Write code in: test-only; optionally add
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: zero, negative, large numbers, and invalid inputs.
test: cover lib/format/invoice formatAmount and formatYield helpers
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add a copy-to-clipboard share link to the invoice detail page" labels: type:feature, area:invoice-detail, stack:nextjs, stack:react, stack:typescript, priority:low, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
There is no quick way to share a specific invoice from app/invest/[id]/page.js; a user has to copy the URL from the address bar. Add a "Copy link" button that copies the canonical invoice URL to the clipboard and confirms the action, so investors can share an invoice directly.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add a "Copy link" button that writes the absolute invoice URL via the Clipboard API, with a graceful fallback when unavailable.
- Show transient confirmation feedback (reuse the existing toast system if present) without a layout shift.
- Build the URL from the route
idplus the site base; do not hard-code a host.
- Fork the repo and create a branch
git checkout -b feature/invoice-detail-copy-share-link- Implement changes
- Write code in:
app/invest/[id]/page.js, reusingcomponents/ToastProvider.jsx - Write comprehensive tests in:
app/invest/[id]/page.test.tsx - Add documentation: update
COMPONENTS.md - Validate security/a11y: ensure the button is labeled and confirmation is announced.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: clipboard success, clipboard rejection/fallback, and missing route id.
feat: add copy-share-link action to invoice detail page with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add compact-notation support to formatCurrency for large invoice amounts" labels: type:enhancement, area:formatting, stack:nextjs, stack:react, stack:typescript, priority:low, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
lib/format/currency.js always renders the full grouped amount, which overflows the narrow Amount column on components/InvoiceCard.jsx for large invoices (e.g., 1,250,000.00 USD). Add an opt-in compact mode (1.25M) via Intl.NumberFormat notation: "compact", with the full value preserved in a title/aria-label for precision.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add a
compactoption toformatCurrency/formatAmountthat usesnotation: "compact"and falls back to the standard formatter on unsupported environments. - Keep the existing default behavior unchanged when
compactis not requested. - When used on the card, expose the full value to assistive tech and on hover.
- Fork the repo and create a branch
git checkout -b enhancement/format-currency-compact-notation- Implement changes
- Write code in:
lib/format/currency.js,components/InvoiceCard.jsx - Write comprehensive tests in:
lib/format/currency.test.tsx - Add documentation: update
COMPONENTS.md - Validate security/a11y: ensure full precision is available to screen readers.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: thousands, millions, fractional, and invalid inputs.
feat: add compact-notation option to formatCurrency with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Extract a shared formatInvoiceDate helper and remove the per-component date logic" labels: type:refactor, area:formatting, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
Date rendering is duplicated and inconsistent: components/InvoiceCard.jsx has a local formatDate with its own fallback, while the maturity badge and detail page format dates independently. Extract a single formatInvoiceDate helper under lib/format/ with consistent fallback and invalid-date handling, and reuse it everywhere a dueDate is shown.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add
formatInvoiceDate(value, options)in a newlib/format/date.jsreturning a stable fallback for missing/unparseable input. - Replace the local
formatDateincomponents/InvoiceCard.jsxand any other inline date formatting. - Keep output locale-aware and deterministic for tests by allowing an explicit locale/timezone in options.
- Fork the repo and create a branch
git checkout -b refactor/shared-invoice-date-helper- Implement changes
- Write code in:
lib/format/date.js,components/InvoiceCard.jsx - Write comprehensive tests in:
lib/format/date.test.tsx - Add documentation: update
COMPONENTS.md - Validate security/a11y: ensure date text stays plain and escaped.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: valid ISO date,
undefined, empty string, and an unparseable string.
refactor: centralize invoice date formatting in a shared helper with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Centralize backend base-URL resolution into a single getApiBaseUrl helper" labels: type:refactor, area:api-client, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
The pattern process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001" is duplicated across the API layer (for example in lib/api/invoices.js and the health/upload paths), each re-implementing trailing-slash trimming. Extract a single getApiBaseUrl() in lib/config/env.js that resolves, validates, and normalizes the base URL once.
- Repository scope: Liquifact/Liquifact-frontend only.
- Add
getApiBaseUrl()that readsNEXT_PUBLIC_API_URL, applies the localhost fallback, and strips trailing slashes. - Reject obviously invalid values (non-http(s) schemes) rather than building broken request URLs.
- Replace the inline resolution in every API client so the logic lives in one place.
- Fork the repo and create a branch
git checkout -b refactor/api-base-url-resolver- Implement changes
- Write code in:
lib/config/env.js,lib/api/invoices.js,lib/api/health.js - Write comprehensive tests in:
lib/config/env.test.tsx - Add documentation: update
docsintegration notes - Validate security/a11y: ensure only safe http(s) origins are accepted.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: unset env, trailing slashes, and an invalid scheme.
refactor: centralize API base-URL resolution in getApiBaseUrl with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add an end-to-end test for connecting Freighter with a mocked wallet provider" labels: type:test, area:wallet, stack:nextjs, stack:react, stack:typescript, priority:high, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
The wallet connect path spans components/WalletStatus.jsx, components/WalletContext.jsx, and lib/wallet/freighter.js, but there is no end-to-end test that drives the full connect flow in a browser. Add a Playwright test that mocks the @stellar/freighter-api surface and verifies the UI transitions from disconnected to connected and renders a truncated address.
- Repository scope: Liquifact/Liquifact-frontend only.
- Inject a mock Freighter provider (via init script /
__mocks__) exposingisConnected,requestAccess, andgetNetworkDetails. - Assert the connect button advances through connecting and lands on connected with the truncated public key shown.
- Cover the rejection path so a denied
requestAccesssurfaces an error state.
- Fork the repo and create a branch
git checkout -b test/e2e-freighter-connect-flow- Implement changes
- Write code in: Playwright spec under
tests; reuse__mocks__ - Write comprehensive tests in:
tests/wallet-connect.spec.tsx - Add documentation: update
TESTING.md - Validate security/a11y: ensure no real wallet keys are used in the mock.
- Write code in: Playwright spec under
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: successful connect, user rejection, and an already-connected session.
test: add Playwright e2e for the Freighter connect flow with a mocked provider
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add a frontend ARCHITECTURE guide mapping the App Router routes and data flow" labels: type:docs, area:architecture, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
New contributors must reverse-engineer how data flows from lib/api through the App Router pages (app/page.js, app/invest/page.js, app/invest/[id]/page.js, app/invoices/page.js) into the shared components. Add an architecture guide that maps routes, the mock-vs-live data layers, and where wallet state lives.
- Repository scope: Liquifact/Liquifact-frontend only.
- Document each App Router route, its loading/error files, and which
lib/apiclient it consumes. - Explain the mock-data layer (
app/invest/lib.js) vs the live client (lib/api/invoices.js) and the migration boundary. - Include a simple route-to-component diagram and where wallet/context providers sit in
app/layout.js.
- Fork the repo and create a branch
git checkout -b docs/frontend-architecture-guide- Implement changes
- Write code in: documentation only
- Write comprehensive tests in: n/a β add a link-check note; if a doc test harness exists, assert referenced files exist
- Add documentation: add
docs/architecture.mdand link it fromREADME.md - Validate security/a11y: ensure no secrets or private endpoints are documented.
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: verify every referenced path in the guide actually exists.
docs: add frontend architecture and data-flow guide
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Show a Stellar network badge in the app header reflecting the configured environment" labels: type:feature, area:wallet, stack:nextjs, stack:react, stack:typescript, priority:low, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
Investors cannot tell at a glance whether they are interacting with testnet or mainnet. Add a small network badge in the header (alongside components/WalletStatus.jsx) that reflects NEXT_PUBLIC_STELLAR_NETWORK, and visually distinguishes testnet so users are never confused about which ledger they are on.
- Repository scope: Liquifact/Liquifact-frontend only.
- Read the configured network via
lib/config/env.jsand render a labeled badge (e.g., "Testnet"). - Apply a distinct, non-color-only treatment for non-mainnet so testnet is unmistakable.
- Place the badge near the wallet status in the header without disrupting existing layout or focus order.
- Fork the repo and create a branch
git checkout -b feature/header-network-badge- Implement changes
- Write code in:
app/layout.js,components/WalletStatus.jsx - Write comprehensive tests in:
components/WalletStatus.test.tsx - Add documentation: update
WALLET_INTEGRATION_CONTRACT.md - Validate security/a11y: ensure the badge has a text label, not color alone.
- Write code in:
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: testnet, mainnet/public, and an unset network value.
feat: add a Stellar network badge to the app header with tests
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward. ++++++
type: Feature title: "Add tests asserting fetchInvestableInvoices normalizes and defaults every invoice field" labels: type:test, area:api-client, stack:nextjs, stack:react, stack:typescript, priority:medium, MAYBE REWARDED, GRANTFOX OSS, OFFICIAL CAMPAIGN assignees: ''
lib/api/invoices.js maps each raw payload entry to the UI contract { id, issuer, amount, currency, dueDate, yield, status }, defaulting missing fields to null and guarding against non-array payloads. This normalization is load-bearing for the marketplace but is under-tested. Add focused tests that pin the field defaulting and error behavior so a backend shape change is caught early.
- Repository scope: Liquifact/Liquifact-frontend only.
- Assert that partial invoice objects get every missing field defaulted to
null. - Assert the
yieldrename mapping (yieldin,yieldout) and that unknown extra fields are dropped. - Assert the not-OK, invalid-JSON, and non-array error paths throw the documented messages.
- Fork the repo and create a branch
git checkout -b test/api-invoices-normalization- Implement changes
- Write code in: test-only against
lib/api/invoices.js - Write comprehensive tests in:
lib/api/invoices.test.ts - Add documentation: note the normalization contract in
docs - Validate security/a11y: ensure malformed payloads cannot inject unexpected fields downstream.
- Write code in: test-only against
- Test and commit
- Run
npm run lint,npm test, andnpm run build. - Cover edge cases: empty array, partial objects,
nullentries, and a non-array body.
test: pin fetchInvestableInvoices field normalization and error paths
- Minimum 95 percent test coverage for impacted modules.
- Clear, reviewer-focused documentation.
- Timeframe: 96 hours.
- π¬ Join the Liquifact community on Discord for questions, reviews, and faster merges: https://discord.gg/JrGPH4V3
- β This is a GrantFox OSS / Official Campaign task and may be rewarded. When your PR is merged you'll be prompted to rate the project β if this issue and the maintainers helped you ship, we'd be grateful for a 5-star rating. Clear questions in Discord and tidy, well-tested PRs are the fastest path to a merge and a reward.