Skip to content

build(deps): bump hono from 4.12.9 to 4.12.12 in the npm_and_yarn group across 1 directory#104

Merged
github-actions[bot] merged 1 commit intodevelopfrom
dependabot/npm_and_yarn/npm_and_yarn-7868ad5c7f
Apr 13, 2026
Merged

build(deps): bump hono from 4.12.9 to 4.12.12 in the npm_and_yarn group across 1 directory#104
github-actions[bot] merged 1 commit intodevelopfrom
dependabot/npm_and_yarn/npm_and_yarn-7868ad5c7f

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot bot commented on behalf of github Apr 8, 2026

Bumps the npm_and_yarn group with 1 update in the / directory: hono.

Updates hono from 4.12.9 to 4.12.12

Release notes

Sourced from hono's releases.

v4.12.12

Security fixes

This release includes fixes for the following security issues:

Middleware bypass via repeated slashes in serveStatic

Affects: Serve Static middleware. Fixes a path normalization inconsistency where repeated slashes (//) could bypass route-based middleware protections and allow access to protected static files. GHSA-wmmm-f939-6g9c

Path traversal in toSSG() allows writing files outside the output directory

Affects: toSSG() for Static Site Generation. Fixes a path traversal issue where crafted ssgParams values could write files outside the configured output directory. GHSA-xf4j-xp2r-rqqx

Incorrect IP matching in ipRestriction() for IPv4-mapped IPv6 addresses

Affects: IP Restriction Middleware. Fixes improper handling of IPv4-mapped IPv6 addresses (e.g. ::ffff:127.0.0.1) that could cause allow/deny rules to be bypassed. GHSA-xpcf-pg52-r92g

Missing validation of cookie name on write path in setCookie()

Affects: setCookie(), serialize(), and serializeSigned() from hono/cookie. Fixes missing validation of cookie names on the write path, preventing inconsistent handling between parsing and serialization. GHSA-26pp-8wgv-hjvm

Non-breaking space prefix bypass in cookie name handling in getCookie()

Affects: getCookie() from hono/cookie. Fixes a discrepancy in cookie name handling that could allow attacker-controlled cookies to override legitimate ones and bypass prefix protections. GHSA-r5rp-j6wh-rvv4


Users who use Serve Static, Static Site Generation, Cookie utilities, or IP restriction middleware are strongly encouraged to upgrade to this version.

v4.12.11

What's Changed

New Contributors

Full Changelog: honojs/hono@v4.12.10...v4.12.11

v4.12.10

What's Changed

New Contributors

... (truncated)

Commits

@dependabot dependabot bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Apr 8, 2026
@vercel
Copy link
Copy Markdown

vercel bot commented Apr 8, 2026

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

Project Deployment Actions Updated (UTC)
voidpay Ready Ready Preview, Comment Apr 13, 2026 9:26pm

Bumps the npm_and_yarn group with 1 update in the / directory: [hono](https://github.com/honojs/hono).


Updates `hono` from 4.12.9 to 4.12.12
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](honojs/hono@v4.12.9...v4.12.12)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/npm_and_yarn-7868ad5c7f branch from eaa5bcd to c0ab7bf Compare April 13, 2026 21:01
@github-actions github-actions bot merged commit 47b7079 into develop Apr 13, 2026
6 of 7 checks passed
@dependabot dependabot bot deleted the dependabot/npm_and_yarn/npm_and_yarn-7868ad5c7f branch April 13, 2026 21:04
ignromanov added a commit that referenced this pull request Apr 14, 2026
…ity (#137)

* docs: update privacy policy with Umami analytics details

Add dedicated "Product Analytics" section, add Umami to Third-Party
Services, fix misleading "Analytics or telemetry" item in
"What We Don't Collect" section.

* fix(demo): correct demo invoice data and native token template loading

- Fix txHash #1 missing 2 hex chars (62→64 hex digits)
- Remove redundant "(40 hours)" from description where qty=40
- Change Invoice #2 discount from 8% to 5% so tax/discount don't cancel out
- Fix native token (ETH, POL) not recognized when loading invoice as template:
  spread merge didn't clear default tokenAddress when decoded data omits the key

* docs: add community files, security policy, README redesign

- LICENSE (MIT)
- SECURITY.md + public/.well-known/security.txt (RFC 9116)
- CONTRIBUTING.md, CODE_OF_CONDUCT.md (Contributor Covenant v2.1)
- README.md full redesign: badges, How It Works, features, quick start
- .github/FUNDING.yml (GitHub Sponsors + Giveth)
- .github/dependabot.yml (weekly npm, monthly GHA)
- .github/pull_request_template.md
- .github/ISSUE_TEMPLATE/feature_request.md

* fix(docs): simplify PR template to match existing style

Summary + Test plan (lowercase), no generic checklist — CI handles validation.

* fix(docs): PR template with structured summary and specific test plan

Matches PR #45 style: subsections for larger PRs, concrete test checkboxes.

* ci: add Dependabot auto-merge for patch and minor updates

Auto-approve and squash-merge Dependabot PRs for patch/minor versions
after CI passes. Major version updates require manual review.

* build(deps-dev): bump tailwindcss from 4.1.18 to 4.2.2 (#70)

Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.1.18 to 4.2.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.2/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.2.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump tailwind-merge from 3.4.0 to 3.5.0 (#62)

Bumps [tailwind-merge](https://github.com/dcastil/tailwind-merge) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/dcastil/tailwind-merge/releases)
- [Commits](https://github.com/dcastil/tailwind-merge/compare/v3.4.0...v3.5.0)

---
updated-dependencies:
- dependency-name: tailwind-merge
  dependency-version: 3.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump zustand from 5.0.9 to 5.0.12 (#68)

Bumps [zustand](https://github.com/pmndrs/zustand) from 5.0.9 to 5.0.12.
- [Release notes](https://github.com/pmndrs/zustand/releases)
- [Commits](https://github.com/pmndrs/zustand/compare/v5.0.9...v5.0.12)

---
updated-dependencies:
- dependency-name: zustand
  dependency-version: 5.0.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump lint-staged from 16.2.7 to 16.4.0 (#61)

Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.2.7 to 16.4.0.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.2.7...v16.4.0)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 16.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump viem from 2.43.4 to 2.47.6 (#63)

Bumps [viem](https://github.com/wevm/viem) from 2.43.4 to 2.47.6.
- [Release notes](https://github.com/wevm/viem/releases)
- [Commits](https://github.com/wevm/viem/compare/viem@2.43.4...viem@2.47.6)

---
updated-dependencies:
- dependency-name: viem
  dependency-version: 2.47.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @next/eslint-plugin-next from 16.1.1 to 16.2.1 (#69)

Bumps [@next/eslint-plugin-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-plugin-next) from 16.1.1 to 16.2.1.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.1/packages/eslint-plugin-next)

---
updated-dependencies:
- dependency-name: "@next/eslint-plugin-next"
  dependency-version: 16.2.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump zod from 4.3.4 to 4.3.6 (#66)

Bumps [zod](https://github.com/colinhacks/zod) from 4.3.4 to 4.3.6.
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v4.3.4...v4.3.6)

---
updated-dependencies:
- dependency-name: zod
  dependency-version: 4.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(github): issue templates frontmatter, dependabot auto-merge workflow

- Add name/about/title/assignees to issue templates so GitHub recognizes them
- Create config.yml disabling blank issues with security advisory link
- Replace dependabot-auto-merge.yml with simplified dependabot-automerge.yml

* build(deps-dev): bump lucide-static from 0.577.0 to 1.7.0 (#67)

Bumps [lucide-static](https://github.com/lucide-icons/lucide) from 0.577.0 to 1.7.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/compare/0.577.0...1.7.0)

---
updated-dependencies:
- dependency-name: lucide-static
  dependency-version: 1.7.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @types/node from 22.19.3 to 25.5.0 (#65)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.19.3 to 25.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.5.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/upload-artifact from 4 to 7 (#60)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump pnpm/action-setup from 4 to 5 (#59)

Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 5.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v4...v5)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/checkout from 4 to 6 (#58)

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/cache from 4 to 5 (#57)

Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/setup-node from 4 to 6 (#56)

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump picomatch from 2.3.1 to 2.3.2 (#55)

Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vitest and @vitest/coverage-istanbul (#64)

Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) and [@vitest/coverage-istanbul](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-istanbul). These dependencies needed to be updated together.

Updates `vitest` from 4.0.16 to 4.1.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.2/packages/vitest)

Updates `@vitest/coverage-istanbul` from 4.0.16 to 4.1.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.2/packages/coverage-istanbul)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
- dependency-name: "@vitest/coverage-istanbul"
  dependency-version: 4.1.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump the npm_and_yarn group across 1 directory with 11 updates (#71)

Bumps the npm_and_yarn group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [next](https://github.com/vercel/next.js) | `15.5.9` | `15.5.14` |
| [happy-dom](https://github.com/capricorn86/happy-dom) | `20.0.11` | `20.8.9` |
| [ajv](https://github.com/ajv-validator/ajv) | `6.12.6` | `6.14.0` |
| [axios](https://github.com/axios/axios) | `1.13.2` | `1.14.0` |
| [brace-expansion](https://github.com/juliangruber/brace-expansion) | `1.1.12` | `1.1.13` |
| [flatted](https://github.com/WebReflection/flatted) | `3.3.3` | `3.4.2` |
| [h3](https://github.com/h3js/h3) | `1.15.4` | `1.15.10` |
| [hono](https://github.com/honojs/hono) | `4.11.3` | `4.12.9` |
| [minimatch](https://github.com/isaacs/minimatch) | `3.1.2` | `3.1.5` |
| [rollup](https://github.com/rollup/rollup) | `4.54.0` | `4.60.1` |
| [socket.io-parser](https://github.com/socketio/socket.io) | `4.2.5` | `4.2.6` |



Updates `next` from 15.5.9 to 15.5.14
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.5.9...v15.5.14)

Updates `happy-dom` from 20.0.11 to 20.8.9
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.11...v20.8.9)

Updates `ajv` from 6.12.6 to 6.14.0
- [Release notes](https://github.com/ajv-validator/ajv/releases)
- [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.6...v6.14.0)

Updates `axios` from 1.13.2 to 1.14.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.2...v1.14.0)

Updates `brace-expansion` from 1.1.12 to 1.1.13
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.12...v1.1.13)

Updates `flatted` from 3.3.3 to 3.4.2
- [Commits](https://github.com/WebReflection/flatted/compare/v3.3.3...v3.4.2)

Updates `h3` from 1.15.4 to 1.15.10
- [Release notes](https://github.com/h3js/h3/releases)
- [Changelog](https://github.com/h3js/h3/blob/v1.15.10/CHANGELOG.md)
- [Commits](https://github.com/h3js/h3/compare/v1.15.4...v1.15.10)

Updates `hono` from 4.11.3 to 4.12.9
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.11.3...v4.12.9)

Updates `minimatch` from 3.1.2 to 3.1.5
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

Updates `rollup` from 4.54.0 to 4.60.1
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.54.0...v4.60.1)

Updates `socket.io-parser` from 4.2.5 to 4.2.6
- [Release notes](https://github.com/socketio/socket.io/releases)
- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io/compare/socket.io-parser@4.2.5...socket.io-parser@4.2.6)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 15.5.14
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: happy-dom
  dependency-version: 20.8.9
  dependency-type: direct:development
  dependency-group: npm_and_yarn
- dependency-name: ajv
  dependency-version: 6.14.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: axios
  dependency-version: 1.14.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: brace-expansion
  dependency-version: 1.1.13
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: h3
  dependency-version: 1.15.10
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: hono
  dependency-version: 4.12.9
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: rollup
  dependency-version: 4.60.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: socket.io-parser
  dependency-version: 4.2.6
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump yaml from 2.8.2 to 2.8.3 (#53)

Bumps [yaml](https://github.com/eemeli/yaml) from 2.8.2 to 2.8.3.
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.8.2...v2.8.3)

---
updated-dependencies:
- dependency-name: yaml
  dependency-version: 2.8.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @xmldom/xmldom (#72)

Bumps the npm_and_yarn group with 1 update in the / directory: [@xmldom/xmldom](https://github.com/xmldom/xmldom).


Updates `@xmldom/xmldom` from 0.8.11 to 0.8.12
- [Release notes](https://github.com/xmldom/xmldom/releases)
- [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xmldom/xmldom/compare/0.8.11...0.8.12)

---
updated-dependencies:
- dependency-name: "@xmldom/xmldom"
  dependency-version: 0.8.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs: add Drips FUNDING.json + fix Giveth URL in FUNDING.yml

- FUNDING.json: Drips Network project claim (treasury wallet)
- FUNDING.yml: correct Giveth project URL slug

* Add newline at end of FUNDING.json

Fix formatting by adding a newline at the end of the file.

* docs: add OP Atlas projectId to FUNDING.json

* docs: add Optimism network to Drips FUNDING.json

* docs: add Buy Me a Coffee to FUNDING.yml

* build(deps): bump lodash in the npm_and_yarn group across 1 directory (#78)

Bumps the npm_and_yarn group with 1 update in the / directory: [lodash](https://github.com/lodash/lodash).


Updates `lodash` from 4.17.21 to 4.18.1
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump defu in the npm_and_yarn group across 1 directory (#80)

Bumps the npm_and_yarn group with 1 update in the / directory: [defu](https://github.com/unjs/defu).


Updates `defu` from 6.1.4 to 6.1.6
- [Release notes](https://github.com/unjs/defu/releases)
- [Changelog](https://github.com/unjs/defu/blob/main/CHANGELOG.md)
- [Commits](https://github.com/unjs/defu/compare/v6.1.4...v6.1.6)

---
updated-dependencies:
- dependency-name: defu
  dependency-version: 6.1.6
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: remove robots.txt (static export doesn't serve it)

* feat: add 512x512 app icon for PWA and social sharing

* feat: add TalentApp domain verification meta tag

* build(deps): bump @tanstack/react-query from 5.90.16 to 5.96.2 (#82)

Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.90.16 to 5.96.2.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.96.2/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.96.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @next/eslint-plugin-next from 16.2.1 to 16.2.2 (#84)

Bumps [@next/eslint-plugin-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-plugin-next) from 16.2.1 to 16.2.2.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.2/packages/eslint-plugin-next)

---
updated-dependencies:
- dependency-name: "@next/eslint-plugin-next"
  dependency-version: 16.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump framer-motion from 12.23.26 to 12.38.0 (#87)

Bumps [framer-motion](https://github.com/motiondivision/motion) from 12.23.26 to 12.38.0.
- [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/motiondivision/motion/compare/v12.23.26...v12.38.0)

---
updated-dependencies:
- dependency-name: framer-motion
  dependency-version: 12.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @vitejs/plugin-react from 5.1.2 to 5.2.0 (#88)

Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 5.1.2 to 5.2.0.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/plugin-react@5.2.0/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.2.0/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump postcss from 8.5.6 to 8.5.8 (#89)

Bumps [postcss](https://github.com/postcss/postcss) from 8.5.6 to 8.5.8.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.6...8.5.8)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump typescript-eslint from 8.51.0 to 8.58.0 (#92)

Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.51.0 to 8.58.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.58.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.58.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @testing-library/react from 16.3.1 to 16.3.2 (#93)

Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 16.3.1 to 16.3.2.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v16.3.1...v16.3.2)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-version: 16.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @web3icons/react from 4.1.14 to 4.1.17 (#94)

Bumps [@web3icons/react](https://github.com/0xa3k5/web3icons/tree/HEAD/packages/react) from 4.1.14 to 4.1.17.
- [Release notes](https://github.com/0xa3k5/web3icons/releases)
- [Changelog](https://github.com/0xa3k5/web3icons/blob/main/packages/react/CHANGELOG.md)
- [Commits](https://github.com/0xa3k5/web3icons/commits/@web3icons/react@4.1.17/packages/react)

---
updated-dependencies:
- dependency-name: "@web3icons/react"
  dependency-version: 4.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @upstash/ratelimit from 2.0.7 to 2.0.8 (#91)

Bumps [@upstash/ratelimit](https://github.com/upstash/ratelimit) from 2.0.7 to 2.0.8.
- [Release notes](https://github.com/upstash/ratelimit/releases)
- [Commits](https://github.com/upstash/ratelimit/compare/v2.0.7...v2.0.8)

---
updated-dependencies:
- dependency-name: "@upstash/ratelimit"
  dependency-version: 2.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @eslint/eslintrc from 3.3.3 to 3.3.5 (#96)

Bumps [@eslint/eslintrc](https://github.com/eslint/eslintrc) from 3.3.3 to 3.3.5.
- [Release notes](https://github.com/eslint/eslintrc/releases)
- [Changelog](https://github.com/eslint/eslintrc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslintrc/compare/eslintrc-v3.3.3...eslintrc-v3.3.5)

---
updated-dependencies:
- dependency-name: "@eslint/eslintrc"
  dependency-version: 3.3.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump pixi.js from 8.14.3 to 8.17.1 (#100)

Bumps [pixi.js](https://github.com/pixijs/pixijs) from 8.14.3 to 8.17.1.
- [Release notes](https://github.com/pixijs/pixijs/releases)
- [Commits](https://github.com/pixijs/pixijs/compare/v8.14.3...v8.17.1)

---
updated-dependencies:
- dependency-name: pixi.js
  dependency-version: 8.17.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump geist from 1.5.1 to 1.7.0 (#98)

Bumps [geist](https://github.com/vercel/geist-font/tree/HEAD/packages/next) from 1.5.1 to 1.7.0.
- [Release notes](https://github.com/vercel/geist-font/releases)
- [Changelog](https://github.com/vercel/geist-font/blob/main/packages/next/CHANGELOG.md)
- [Commits](https://github.com/vercel/geist-font/commits/geist@1.7.0/packages/next)

---
updated-dependencies:
- dependency-name: geist
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @types/node from 25.5.0 to 25.5.2 (#99)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.5.0 to 25.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump viem from 2.47.6 to 2.47.10 (#97)

Bumps [viem](https://github.com/wevm/viem) from 2.47.6 to 2.47.10.
- [Release notes](https://github.com/wevm/viem/releases)
- [Commits](https://github.com/wevm/viem/compare/viem@2.47.6...viem@2.47.10)

---
updated-dependencies:
- dependency-name: viem
  dependency-version: 2.47.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @eslint/js from 9.39.2 to 9.39.4 (#101)

Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.39.2 to 9.39.4.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/commits/v9.39.4/packages/js)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.39.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite in the npm_and_yarn group across 1 directory (#102)

Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.3.0 to 7.3.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.2
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* refactor(history): redesign history page cards with payment panel style (#103)

* feat(history): add StatusGradientBar component

* feat(history): add NetworkBadge component with tests

* refactor(history): redesign InvoiceStatusBadge with dot + glow

* refactor(history): restyle InvoiceCardShell with zinc-900 + gradient bar

* refactor(history): rewrite HistoryList with new card layout, network badge, subtotal

* refactor(history): rewrite ReceivedInvoiceList with unified card design + Template button

* refactor(history): update HistoryWorkspace colors gray→zinc

* fix(history): remove unused type imports in ReceivedInvoiceList

* refactor(history): extract shared InvoiceCard, remove duplicate card components

Unified HistoryEntryCard and ReceivedInvoiceCard (~95% identical) into a
single InvoiceCard with a nameLabel prop. Removed defeated memo(), pointless
useMemo, dead source prop, and unnecessary JSX comments. Collapsed identical
DecodedReceivedInvoice type into alias for DecodedHistoryEntry.

* refactor(history): consolidate duplicated configs, merge list components

- Merge HistoryList + ReceivedInvoiceList into unified InvoiceList with
  variant prop ('created'|'received') controlling route, name, empty text
- Extract INVOICE_STATUS_CHIPS to entities/invoice for shared status colors
  consumed by InvoiceStatusBadge (features) and StatusChip (widgets)
- Move network badge dark-mode colors to entities/network (NETWORK_BADGES_DARK)
- Add formatDateMedium, formatDateCompact, isoToUnix to shared/lib/date-time
- Remove deprecated DecodedReceivedInvoice type alias
- Net -54 lines, 59/59 tests pass, tsc + lint clean

* feat: add Base network (8453) + refactor network visual system (#79)

* fix: remove robots.txt (static export doesn't serve it)

* feat: add BaseIcon SVG component for Base network

* feat: add Base (8453) and Base Sepolia (84532) to chain config

* feat: add Base network metadata and codes

* feat: add Base token registry (ETH, USDC, USDT)

* feat: add Base provider slugs for Alchemy and Infura

* feat: add Base confirmation config (OP Stack)

* feat: add Base block estimation parameters

* feat: add Base UI theming, badges, glows, and explorer

* feat: add Base RPC URL env vars to schema

* fix: add Base to theme configs, update chain count tests and snapshots

* fix: add Base to NetworkIcon component (web3icons + fallback)

* fix: update Base reference block from live explorer data

* refactor: remove unused BaseIcon (NetworkIcon uses @web3icons/react)

* fix: boost Base glow opacity (blue is subtle on dark background)

* revert: restore original Base glow values

* fix: resolve testnet glow/shadow/badge lookups via withTestnets helper

Visual config Records (NETWORK_SHADOWS, NETWORK_GLOWS, NETWORK_GLOW_SHADOWS,
NETWORK_GLOW_BORDERS, NETWORK_BADGES) were keyed by mainnet chain IDs only,
causing missing glow on testnet invoices (e.g. Base Sepolia 84532).

Added withTestnets() helper that auto-derives testnet entries from
TESTNET_PARENT, so new networks only need one mapping update.

* docs: update supported networks count and add Base to README and snapshot tests

* docs: add Base to all network references across landing, legal, and test files

* refactor: create canonical network palette and testnet utilities

* chore: bump Node.js version to v24 in .nvmrc

* chore: gitignore AI tool facades, plugins, and supabase local config

* refactor: rename getNetworkTheme→getNetworkName, extract testnet utils, lowercase addresses

* refactor: derive brand-tokens from palette, remove dead env vars, fix NetworkIcon a11y

- NetworkTheme now aliases NetworkThemeName from network-palette (canonical source)
- isValidNetworkTheme validates against NETWORK_PALETTE instead of NETWORK_THEMES
- Remove 10 dead NEXT_PUBLIC_ALCHEMY/INFURA_*_URL env vars (RPC proxy uses API keys + slug maps)
- NetworkIcon resolves testnet chain IDs to mainnet for icon/color/letter lookup
- Add aria-label to both branded and fallback NetworkIcon paths
- Export NETWORK_PALETTE and NetworkThemeName from shared/ui public API

* refactor: derive network-themes from canonical palette + withTestnets

* refactor: update consumers to use getNetworkThemeName, hoist widget colors

* feat: add Base demo invoice, fix tokenAddress not clearing for native tokens

Add 5th demo invoice for Base network (USDC, pending status) to landing
page carousel. Fix react-hook-form reset() not clearing tokenAddress when
loading native token templates (ETH/POL) — undefined must be mapped to ''
so RHF treats it as an explicit value rather than "keep current".

* fix: address PR review findings — remove unverified USDT, harden env, stabilize snapshots

- Remove Base USDT token (no official Tether deployment on Base)
- Add BLOCK_EXPLORERS comment explaining withTestnets exclusion
- Update Base Sepolia block anchor from live RPC (28M → 39.88M)
- Replace Math.random() with crypto.randomUUID() in RPC proxy
- Harden validateEnv to throw in production on missing vars
- Add Radix UI snapshot serializer for stable aria-controls IDs

* fix: prevent stale total when switching tokens, add replaceDraft for clean data loading

Total was stored as pre-calculated atomic units tied to a specific token's
decimals. Switching tokens reconverted line item rates but left total stale,
causing the preview to format ETH-scale values with USDC decimals (e.g.
5,510,000,000,000 instead of 5.80).

- Add replaceDraft() for atomic draft replacement (hash decode, template load)
- Extract toInvoiceItems/draftWithItems helpers, DRY 4 line item methods
- Clear stale total on: token switch, item mutations, template save/load
- Strip total from hash decode in CreateWorkspace (editor recalculates)
- Handle string quantities in invoiceItemsToLineItems (old localStorage)

* fix(history): resolve testnet networks showing as "Unknown" in history badges

Use getNetworkName() for O(1) lookup across all networks instead of
NETWORK_CONFIG.find() which only covered mainnets. Wrap NETWORK_BADGES_DARK
with withTestnets() so testnet badges inherit parent network brand colors.

* fix(create): reset all draft fields on form clear, extract store→form adapter

draftSyncStatus leaked through reset because createNewDraft/clearDraft/replaceDraft
didn't explicitly set it to 'idle'. Tax/discount/notes leaked because
react-hook-form treats undefined in reset() as "keep previous value".

Extract draftDataToFormValues() adapter as single source of truth for
PartialInvoice→InvoiceFormValues conversion, replacing duplicated 60-line
inline mappings. All optional string fields now coerced to '' on reset.

* fix(test): align NetworkBadge test with getNetworkName fallback to chain ID

* feat: update comparison table data to April 2026 research

RF pricing changed to \$250+/mo subscription, data storage corrected to
Centralized (hybrid API + on-chain, not pure IPFS), KYC/KYB updated to
required (yes). Disclaimer and comment block updated to April 2026.

* feat: add comparison page content data (VP vs Request Finance)

* feat: add /compare/request-finance comparison page

* feat: add /compare pages priority to sitemap config

* feat: add link to detailed comparison from landing table

* test: add comparison page tests

* fix: improve comparison page UI and remove duplicate footer

Apply UI/UX audit improvements: text-pretty headings, tabular-nums
table, hover states, glow CTA button, visual star rating, TL;DR label,
violet accent on bottom-line boxes. Remove duplicate footer links
since app-level footer already exists.

* ci: add project-sync workflow for auto VP Roadmap sync

New issues automatically added to VP Roadmap project board
with fields (Status, Priority, Advisor, Type, Source Repo)
parsed from labels. Agents no longer need manual item-add.

* fix(ci): use GraphQL API for project-sync workflow

gh project item-add/item-edit fail with "unknown owner type"
on user-level projects. Switch to direct GraphQL mutations.

* chore: add .superpowers/ to gitignore

* fix: invoice generation bugs — flash, source immutability, cross-tab sync (#105)

* fix: prevent invoice flash on generate, preserve source immutability, add cross-tab sync

- Remove clearDraft setTimeout that caused visible flash during navigation
- Make TrackedInvoice.source immutable (first-write-wins) so visiting /pay
  doesn't overwrite 'created' to 'received'
- Add localStorage storage event listener for cross-tab store rehydration

* fix(ui): add cursor-pointer to CreatorHintBanner dismiss button

* fix(store): key TrackedInvoice by contentHash (SHA-256) instead of invoiceId (#112)

* feat(codec): add computeContentHash — SHA-256 bytes32 digest for invoice identity

* feat(codec): return contentHash from parseInvoiceHash

* feat(store): key TrackedInvoice by contentHash instead of invoiceId

* feat(create): compute contentHash on invoice generation

* feat(view): compute and expose contentHash from useInvoiceView

* feat(import): compute contentHash for imported invoices

* refactor(ui): wire contentHash through component hierarchy

* refactor(payment): all hooks key by contentHash instead of invoiceId

Updates SmartPayButtonProps, UsePaymentFlowParams, UsePaymentVerificationParams,
UseFinalizationTrackerParams, UsePaymentPollingParams, and UseManualVerifyParams
to accept contentHash. All store action calls (setTxHash, setError, setValidated,
setFinalized, resetPaymentState, setConfirmations) now use contentHash as the key.
Internal polling helpers (loops, visibility-handler) updated consistently.

* fix: use contentHash key in polling params

* test: update all tests for contentHash-based store key

* fix: review fixes — runtime bugs, security hardening, perf improvements

- Fix PaymentPanel using invoiceId instead of contentHash for store lookup (BUG-01: PDF export lost paidAt)
- Fix DevStatusToggle passing invoiceId to contentHash-keyed store methods (BUG-02)
- Use Promise.allSettled in migration to survive partial failures (S-01)
- Always recompute contentHash on import, never trust pre-supplied values (S-02)
- Add empty fragment guard in addToHistory (H-1)
- Early return in setTxHash for unknown invoice (M-2)
- Add console.warn to migration catch block (F-04)
- Parallelize decode + hash in parseInvoiceHash via Promise.all
- Parallelize import hash computation, eliminate in-place mutation

* fix: resolve history page flickering and infinite migration loop

- Replace non-reactive hasHydrated() with useStoreHydrated() hook that
  subscribes via onFinishHydration for proper React re-render on hydration
- Make persist migration synchronous to avoid zustand v5 hydrationVersion
  race condition that cancelled in-flight async migrations
- Compute contentHash post-hydration via onFinishHydration + hasHydrated
  guard to handle both sync and async hydration paths
- Remove cross-tab storage event listener that triggered rehydrate() loops
  from stale tabs still writing version 1

* fix: show full invoice data in debug panel instead of decode flag

* fix: skip post-hydration hash computation on v2+ stores

Add _pendingHashComputation flag set only by migrate() during v1→v2
transition. _computeMissingContentHashes() now exits immediately on
v2+ stores instead of reading store state on every hydration.

* fix: remove console.info logs and fix test type errors

Remove informational console logs from TrackedInvoiceStore (keep warnings).
Add missing contentHash to SmartPayButton test fixtures.
Add scrollMargin to MockIntersectionObserver for TS 5.5+ compat.

* refactor: replace async crypto.subtle with sync @noble/hashes for SHA-256

Async two-phase migration (sync migrate → async post-hydration hash)
caused store data loss: zustand persisted entries with empty contentHash
between phases, and any failure in the async phase dropped invoices.

Switch to sync SHA-256 via @noble/hashes (already a dependency via viem)
so contentHash is computed atomically inside migrate(). Removes ~55 lines
of async infrastructure: _pendingHashComputation, _computeMissingContentHashes,
_sha256, onFinishHydration/hasHydrated fallback.

* docs: fix SECURITY.md — styled-components → inline style injection, add /api/health to out-of-scope

* fix(wallet): sync connection state between scoped Web3Providers

LazyWalletButton in the header could stay in static placeholder state
("Connect") while PayButton's scoped provider already had the wallet
connected. Root cause: LazyWalletButton only checked localStorage on
mount and had no way to detect connections from other providers.

Add WalletStateSync component that dispatches a custom DOM event
on wallet connect, and a listener in LazyWalletButton to activate
when the event fires.

* fix(wallet): prevent rehydration race in scoped Web3Providers

Multiple WagmiProvider instances sharing one wagmiConfig caused
connector state corruption: each mount triggered rehydrate() which
overwrote live connector instances with serialized plain objects
from localStorage. Between rehydrate() and reconnect() completing,
writeContract/sendTransaction crashed with "getChainId is not a
function" because the connector lacked methods.

Use WagmiContext.Provider (context-only, no hydration) for all
Web3Provider instances after the first one. A module-level flag
ensures only the primary instance triggers full WagmiProvider
hydration + reconnect.

* fix(payment): keyframe rotate to prevent SmartPay spinner freeze on Rabby

framer-motion v12 with WAAPI backend stalls single-value rotate loops
on the second iteration when a wallet extension's content script forces
a re-render mid-mount. The breathing label kept animating (keyframes
array) while the spinner icon froze (single value 360).

Switching to explicit keyframes [0, 360] gives WAAPI an unambiguous
start/end on every iteration and matches the pattern already used by
FluidOverlay for all other infinite loops in the button tree.

* fix(history): batch-check unpaid for both created and received invoices

Parametrize useBatchCheck by invoice source so the History page can verify
pending payments for both own and counterparty invoices, not just created.
Add a Check Unpaid button to the Received section mirroring the Created
one. Make invoice number and counterparty name in InvoiceCard clickable —
both trigger the View action with hover/focus styling.

* build(deps): bump viem from 2.47.10 to 2.47.16 (#122)

Bumps [viem](https://github.com/wevm/viem) from 2.47.10 to 2.47.16.
- [Release notes](https://github.com/wevm/viem/releases)
- [Commits](https://github.com/wevm/viem/compare/viem@2.47.10...viem@2.47.16)

---
updated-dependencies:
- dependency-name: viem
  dependency-version: 2.47.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump typescript-eslint from 8.58.0 to 8.58.2 (#124)

Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.58.0 to 8.58.2.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.58.2/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.58.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @noble/hashes from 2.0.1 to 2.2.0 (#125)

Bumps [@noble/hashes](https://github.com/paulmillr/noble-hashes) from 2.0.1 to 2.2.0.
- [Release notes](https://github.com/paulmillr/noble-hashes/releases)
- [Commits](https://github.com/paulmillr/noble-hashes/compare/2.0.1...2.2.0)

---
updated-dependencies:
- dependency-name: "@noble/hashes"
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump prettier from 3.7.4 to 3.8.2 (#126)

Bumps [prettier](https://github.com/prettier/prettier) from 3.7.4 to 3.8.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.7.4...3.8.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.8.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump use-debounce from 10.0.6 to 10.1.1 (#127)

Bumps [use-debounce](https://github.com/xnimorz/use-debounce) from 10.0.6 to 10.1.1.
- [Release notes](https://github.com/xnimorz/use-debounce/releases)
- [Changelog](https://github.com/xnimorz/use-debounce/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xnimorz/use-debounce/commits)

---
updated-dependencies:
- dependency-name: use-debounce
  dependency-version: 10.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump hono in the npm_and_yarn group across 1 directory (#104)

Bumps the npm_and_yarn group with 1 update in the / directory: [hono](https://github.com/honojs/hono).


Updates `hono` from 4.12.9 to 4.12.12
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.12.9...v4.12.12)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump react-hook-form from 7.70.0 to 7.72.1 (#130)

Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.70.0 to 7.72.1.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.70.0...v7.72.1)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.72.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tailwindcss/postcss from 4.1.18 to 4.2.2 (#131)

Bumps [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) from 4.1.18 to 4.2.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.2/packages/@tailwindcss-postcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.2.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump lucide-static from 1.7.0 to 1.8.0 (#123)

Bumps [lucide-static](https://github.com/lucide-icons/lucide) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/compare/1.7.0...1.8.0)

---
updated-dependencies:
- dependency-name: lucide-static
  dependency-version: 1.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @tanstack/react-query from 5.96.2 to 5.99.0 (#128)

Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.96.2 to 5.99.0.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.99.0/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.99.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @types/node from 25.5.2 to 25.6.0 (#132)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.5.2 to 25.6.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @next/eslint-plugin-next from 16.2.2 to 16.2.3 (#134)

Bumps [@next/eslint-plugin-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-plugin-next) from 16.2.2 to 16.2.3.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.3/packages/eslint-plugin-next)

---
updated-dependencies:
- dependency-name: "@next/eslint-plugin-next"
  dependency-version: 16.2.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(payment): typed wagmi error handling + onReplaced support (#115)

* feat(payment): typed wagmi error handling + onReplaced support

Replace fragile string-matching error classification with typed detection
via viem's BaseError.walk() across the payment and wallet-connect features.
Add onReplaced callback to handle user speedup/cancel of pending transactions.

Component A: shared/lib/web3-errors
- New module with isUserRejected, isInsufficientFunds, isChainMismatch,
  isReceiptNotFound, isReceiptTimeout, isTxReverted, walkCause
- Walks BaseError cause chain via viem's typed API, falls back to string
  matching for non-BaseError edge cases (mobile WalletConnect)
- 38 unit tests covering direct, wrapped, and fallback paths

Component B: classifier refactor
- classify-error.ts rewritten to use typed detectors before string matching
- Removed step-based NETWORK_SWITCH_FAILED fallback — was masking user
  rejections of network switches
- Added TX_REPLACED to PaymentErrorType + ERROR_MESSAGES entry
- CANCELED_COPY constant for message unification
- connection-error.ts now calls isUserRejected first for typed detection

Component C: payment flow integration
- use-payment-flow.ts: console.error moved below USER_REJECTED early return
  (fixes verbose wagmi stack in console on user cancel)
- useWaitForTransactionReceipt now receives onReplaced callback:
  - reason 'cancelled' → toast + RESET (user intent)
  - reason 'replaced'/'repriced' → update hash + continue
- New REPLACED reducer action for hash swap during confirming state
- use-payment-verification.ts: sanitize raw viem errors through
  formatErrorMessage before writing to store + onReplaced observability

* refactor(payment): address review feedback on typed wagmi error handling

- Drop unused _step parameter from classifyPaymentError (dead arg after
  step-based fallback removal); update call site and 20+ test cases.
- Fix incorrect comment in usePaymentVerification onReplaced — both hooks
  consume useWaitForTransactionReceipt in parallel, not sequentially.
- Add TransactionExecutionError coverage to detect.test.ts (revert vs OOG
  shortMessage branches).

* feat(payment-panel): persistent network chip across all states

Adds a branded NetworkIcon + name chip at the top of PaymentPanel so
payers always see which chain the payment targets — visible in pending,
paid, paid-fallback and overdue states. Reserves right-side space via
pr-12 to avoid overlap with the minimize button.

Also migrates AmountDisplay assertions from toBeDefined() to
toBeInTheDocument() per testing rules.

* refactor(payment-panel): anchor network chip to amount, own minimize button

Move the network chip from the panel header into each state's heading row
(Total Due / Payment Successful / Expired / paid-fallback) so it sits
beside the amount it qualifies — semantically tying chain to value
instead of floating in an empty header strip.

Extract NetworkChip into a shared presentational component to drop
duplication across states. Pull the minimize button into PaymentPanel
behind an onMinimize prop, removing the duplicated absolute overlay
from PayWorkspace and InvoiceWorkspace. The button now coordinates with
the pr-12 right-side clearance baked into every heading row.

* fix(history): network icons, button sizing, robust template flow

- NetworkBadge: render NetworkIcon (web3icons) before name
- InvoiceCard: match Confirm/Cancel button height to regular buttons
  (min-h-[44px] py-2.5) to prevent layout shift on delete toggle
- InvoiceList: replace fragile duplicateFromUrl + setState + push flow
  with hash-based navigation /create?template=1#<hash>
- CreateWorkspace: detect ?template=1 and reset issuedAt/dueAt/total/
  magicDust after replaceDraft so templates start with fresh dates
- Remove unused duplicate-invoice.ts and its test mock

* refactor(payment-panel): group network chip with due/paid date

Relocates NetworkChip into a compact metadata row next to the due
date (pending) or relative paidAt (paid/expired). Drops the "TOTAL
DUE" label — the amount is self-explanatory and the label created
a "Total Due ... Due May 2" tautology with the date chunk.

- pending: [chip] Due <date>    above the amount
- paid:    [chip] Funds sent · <relative>    under Payment Successful
- expired: [chip] Was due <date> · Payment disabled    under header

Adds formatRelativeTime() in shared/lib/date-time for ISO →
"Just now" / "5 min ago" / "2 h ago" rendering. PaymentPanel now
subscribes to tracked paidAt via a store selector so the subtitle
reactively updates when the payment transitions to paid.

Clears the chip out of the emerald amount accent box on paid
state — zinc chip no longer clashes with the emerald tint.

* fix(wallet): visible loading state during wagmi reconnect

SmartPayButton and WalletButton both appeared frozen while wagmi
restored the persisted connection: the pay button stayed on "Pay X Y"
while disabled, and the header wallet button was hidden via opacity:0
so clicks fell through. Now both surfaces render an explicit disabled
"Reconnecting…" state with a visible spinner and aria-busy.

Covered by 6 new tests (3 SmartPayButton reconnect cases, 3 WalletButton).

* fix(wallet): cover SSR pre-hydration gap in pay + header buttons

Two bugs under one symptom ("click during page-load race gets stuck at
Connecting"):

1. Pre-hydration gap: wagmi with `ssr: true` reports `status: 'disconnected'`
   on the first client render even when a persisted connection exists in
   localStorage. `isReconnecting` is false in that window, so the previous
   fix did not catch it — SmartPayButton flashed a clickable "Connect Wallet"
   and WalletButton did the same in the header.

2. Stuck-at-connecting race: when a user clicked through the flash,
   `handlePay` entered `connecting` and opened the Rainbow modal. Meanwhile
   wagmi finished the background reconnect. The lifecycle effect in
   `usePaymentFlow` checked `connectModalOpen` before `isConnected`, so if
   Rainbow's modal state didn't cleanly flip through the expected order the
   flow stayed in `connecting` forever.

Fix:
- New shared hook `useWagmiHydrating` detects pre-hydration (persisted
  connector id in localStorage + wagmi still on initial disconnected),
  plus the normal `connecting` / `reconnecting` statuses. Drops the
  pre-hydration heuristic once wagmi leaves the initial snapshot so later
  manual disconnect/reconnect cycles behave normally.
- SmartPayButton and WalletButton now use `useWagmiHydrating` instead of
  `isReconnecting`. Both render a disabled loading button with
  aria-busy=true across the whole hydration window.
- `usePaymentFlow` connecting effect now checks `isConnected` before
  `connectModalOpen`, so a background reconnect always wins and the flow
  cannot strand in `connecting`.
- Regression tests: reorder-safe race in `use-payment-flow`, pre-hydration
  coverage in SmartPayButton + WalletButton suites. 387 payment +
  wallet-connect tests green.

* fix(payment): cap wait-for-receipt timeout at 60s, disable retry

Ensures a stuck transaction surfaces a user-visible RPC_ERROR banner
within one block window instead of hanging on the spinner. Previously,
viem's 180s default timeout combined with TanStack Query's default
retry (3) meant the first user-visible error could be delayed by up
to 9 minutes.

Also drops the TEMP DEBUG console.logs added during manual test
verification — all three test paths (USER_REJECTED silence, onReplaced
cancel, onReplaced speedup) have been validated on Eth Sepolia + Rabby.

Part of PR #115.

* fix(payment): raise wait-for-receipt timeout to viem default 180s

60s was too aggressive — near-zero-gas transactions legitimately need
several blocks on L1 before inclusion. Combined with retry: 0 this
still caps the hidden wait at 3 minutes (vs viem's default retry × 180s
= 9 minutes that motivated the original fix).

Field-verified on Base Sepolia: a stuck tx now surfaces the RPC_ERROR
banner as expected — only thing that needed tuning was the ceiling.

Part of PR #115.

* fix(payment-panel): make error banner X button clickable and cursor visible

Tailwind v4 dropped the default pointer cursor on <button>, and dismissError
only cleared the store — local paymentError stayed set, so the X appeared dead.
Add cursor-pointer + type=button, and wire a composite handler that clears
both paymentError and the tracked-invoice store error.

* refactor(payment): simplify PR #115 after parallel review

Findings from three parallel review agents (reuse, quality, efficiency)
aggregated and fixed:

- Remove dead TX_REPLACED PaymentErrorType: defined but never emitted
  (onReplaced dispatches REPLACED/RESET directly, classifier never
  returns it)
- Remove walkCause from web3-errors barrel export: internal-only,
  test file imports from ../detect
- Memoize onReplaced + extract RECEIPT_QUERY_OPTIONS/TIMEOUT_MS to
  module level in use-payment-flow.ts (inline refs were re-subscribing
  TanStack Query / viem watcher every render during confirming step)
- Hoist stateless handleVerificationReplaced + memoize receiptQuery in
  use-payment-verification.ts (compounded by useBlockNumber watch: true)
- Unwrap naked <div> wrapper with no props/layout in WalletButton.tsx
- Fix misleading CANCELED_COPY comment (claimed cross-feature usage
  that never existed)

Follow-ups tracked in #120 (NetworkChip/NetworkBadge unification),
#121 (nowUnix migration).

Net: -71 / +66 lines. Type-check, lint, 277 affected tests pass.

* fix(payment): address PR #115 review findings

- use receipt.transactionHash on CONFIRMED so replaced/repriced tx
  hashes aren't overwritten by the stale wagmi send hash
- REPLACED reducer explicitly clears error for future-proofing
- console.error logs shortMessage only to avoid leaking calldata
  if observability is wired later
- use-payment-verification: consolidate imports above function decl
- add reducer test covering REPLACED error preservation

* fix(payment): correct block-time drift breaking creator-side verification

Root cause: AVG_BLOCK_TIME_MS[11155111] was 12_000 but Sepolia actually runs
~13s/block. Over 35 days of forward drift estimateFromBlockHex returned a
block above the real chain head; alchemy_getAssetTransfers returned empty and
creators saw "payment not found" on confirmed transactions. Arbitrum Sepolia
had the same class of bug (250ms assumed vs ~286ms measured).

- AVG_BLOCK_TIME_MS: Sepolia 12000→13000, Arb Sepolia 250→286 (measured via
  10k-block samples across all 10 supported chains). REFERENCE_BLOCKS left
  frozen — v1.0 shipped Mar 28, old invoices must decode with the same
  calibration they were created with.
- /api/transfers: defense-in-depth safety net. Fetches eth_blockNumber in
  parallel with the transfers query, and on drifted client fromBlock retries
  with a 3-day lookback anchored to the real chain head. Drift logged via
  console.warn for observability. Eliminates the bug class regardless of
  anchor staleness.
- scripts/measure-block-times.ts + pnpm check:block-drift: diagnostic that
  measures real avgBlockTime for every chain, compares vs hardcoded values,
  reports lookback margin, and exits non-zero on BROKEN verdict.
- Route tests updated for the new parallel fetch; added cases covering both
  retry and no-retry paths of t…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants